Python中__new__方法的详细教程

Python中__new__方法的详细教程

只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义__new__方法,一般用法如下:

class Person(object):
    def __new__(cls):
        return  object.__new__(cls)

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;__new__必须要有返回值,返回实例化出来的实例,可以return父类new出来的实例,或直接是object的new出来的实例。

object.new(cls)执行完返回的结果为Person类的实例对象,如下:

class Person(object):
    def __init__(self):
        print("__init__")
        self.name="张三"
    def __new__(cls):
        print("__new__")
        ob = object.__new__(cls)#ob为Person实例对象
        print(ob)
        return ob
p1 = Person()
print(p1.name)

在这里插入图片描述
p1=Person()该语句主要做了以下工作:
首先调用Person的__new__方法,该方法通过object.new(cls)创建了Person实例对象,并返回。最后调用了该Person实例对象的__new__方法。

object.new()方法接收的参数是类对象,可以不是当前类对象cls,如果将cls换成其他类对象会发生什么呢,看下面代码的运行结果:

class Dog(object):
    def __init__(self):
        self.name="旺财"
        print("Dog.__init__")
class Person(object):
    def __init__(self):
        self.name="张三"
        print("Person.__init__")
    def __new__(cls):
        print("__new__")
        ob = object.__new__(Dog)
        return ob
p1 = Person()
print(type(p1))

在这里插入图片描述
由结果得知p1是Dog类的实例,但是有个问题,Python解释器没有自动执行__new__方法,由结果可以看出并没有打印字符串__new__。若__new__()没有正确返回当前类cls的实例,那__init__()将不会被调用。 我们可以在__new__方法中手动调用__new__方法(实际开发中好像没什么用)

class Dog(object):
    def __init__(self):
        self.name="旺财"
        print("__init__")

class Person(object):
    def __init__(self):
        self.name="张三"
        print("__init__")
    def __new__(cls):
        print("__new__")
        ob = object.__new__(Dog)
        ob.__init__()
        return ob

p1 = Person()
print(type(p1))
print(p1.name)

在这里插入图片描述

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Python中__new__方法的详细教程