只有继承于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 obp1 = 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 obp1 = 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 obp1 = Person()print(type(p1))print(p1.name)