首先,这不是Why is __init__ not called after __new__ SOMETIMES的重复,因为这个问题实际上是关于内置object
类的实现的。
这是全文:
我正在学习python中的__new__
与__init__
。这是我尝试过的示例:
class A(object):
def __new__(cls):
print("A.__new__ called")
return super(A, cls).__new__(cls)
def __init__(self):
print("A.__init__ called")
A()
print('finished')
输出为
A.__new__ called
A.__init__ called
finished
我知道__new__
进行对象创建,__init__
进行对象初始化。
__new__
。然后,每次__init__
返回该类的实例时,都会调用__new__
,并将返回的实例作为__init__
参数传递给self
。
知道这一点,如果我们有一个不好的__new__
函数,它不会创建并返回对象实例,那么__init__
就不会被调用:
class A(object):
def __new__(cls):
print("A.__new__ called")
#return super(A, cls).__new__(cls)
def __init__(self):
print("A.__init__ called")
A()
请注意,__new__
方法仅显示字符串。它不返回任何内容,因此__init__
没有任何内容。确实,输出确认了这一点:
A.__new__ called
finished
"A.__init__ called"
从未被打印过,因此__init__
的确从未被调用过。
现在,如果我们不定义__new__
方法(这是普通用例的99%。程序员很少需要定义此方法),那么默认情况下将调用父亲的__new__
。例如
class A(object):
def __init__(self):
print("A.__init__ called")
A()
print('finished')
输出为:
A.__init__ called
finished
在这种情况下,将调用内置__new__
类的object
。
但是,当我查看内置object
类的定义方式时,我看到了:
class object:
""" The most base type """
def __delattr__(self, *args, **kwargs): # real signature unknown
""" Implement delattr(self, name). """
pass
...
...
...
@staticmethod # known case of __new__
def __new__(cls, *more): # known special case of object.__new__
""" Create and return a new object. See help(type) for accurate signature. """
pass
__new__
中什么都没有实现!里面只有一个pass
!!
这有什么道理?
答案 0 :(得分:2)
某些Cpython实现是用C编写的,因此PyCharm无法导航到源代码,因为它已编译。但是,它可以并且确实会显示模拟签名的存根。
用于3.7.3的object.__new__
的源代码可以在其Github存储库中找到:https://github.com/python/cpython/blob/v3.7.3/Objects/typeobject.c#L3671-L3732