先来看一段代码:
class A(object): # -> don't forget the object specified as base def __new__(cls): print ("A. __new__ called") return super().__new__(cls) def __init__(self): print ("A. __init__ called")A()
输出结果:
A. __new__ calledA. __init__ called
- 执行的顺序是先
__new__
后__init__
。因为函数__new__
在我们调用类的时候会被自动调用,并且返回 instance 给__init__
,也就是__init__
中的 self 。
再来看一段代码:
class A(object): def __new__(cls): print ("A.__new__ called") def __init__(self): print ("A.__init__ called") # -> is actually never calledprint (A())
输出结果:
A.__new__ calledNone
这里__init__
并没有被调用。这是因为与之前不同,这次__new__
override 了父类的__new__
之后,没有使用super()
继承父类其他创建 instance 的 method ,只是单纯的执行打印。所以并没有返回一个 instance 给__init__
的 self。所以返回None
。
再来看如果在__new__
中加入return
功能会如何:
class A(object): def __new__(cls): print ("A. __new__ was called") return 29print (A())
输出结果是:
A.__new__ called29
得用__new__
函数,我们可以在创建类的 instance 的时候返回其他类型的 instance。
class Sample(object): def __str__(self): return "A returned an instance of Sample()"class A(object): def __new__(cls): return Sample()print (A())
输出结果:
A returned an instance of Sample()