Python:如何理解内置对象类中定义的__new__?

时间:2019-06-05 03:40:12

标签: python class object pycharm instantiation

首先,这不是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 !!

这有什么道理?

1 个答案:

答案 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