八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

Python的__new__函数

Posted on 2019-11-28 22:08  闪之剑圣  阅读(1055)  评论(0编辑  收藏  举报

如果你以为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__函数。