如果你以为Python的__init__函数相当于构造函数,那你就大错特错了。__init__只是负责初始化的函数,真正创建对象的函数是__new__函数。
__new__函数是一个类函数,它负责真正的函数创建过程,返回创建的对象。对象创建完毕后,会执行该对象相应的__init__函数。
也就是说,Python对象的创建过程如下列伪代码所示:
obj = class.__new__(args)
if isinstance(obj, class):
class.__init__(obj, args)
return obj
在这里可以看一个实际的例子:
class A(object):
def __new__(cls):
return object.__new__(cls)
def __init__(self):
self.val = 0
可以看到,在__new__的阶段就已经创建了对象,然后__init__只是执行初始化操作而已。
如果这样写:
class A(object):
def __new__(cls):
return 0
def __init__(self):
self.val = 0
a = A()
print a
就会得到为0的输出。因为此时创建的对象是一个int,因此不会再执行A的__init__函数。