首页 > 解决方案 > Python:如何理解内置对象类中定义的 __new__?

问题描述

首先,这不是为什么在 __new__ SOMETIMES 之后不调用 __init__的重复,因为这个问题实际上是关于内置object类的实现。

这是完整的故事:

我正在学习python中的__new__vs。__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__每次返回类的实例时都会调用then __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座位!!???

这有什么意义?

标签: pythonclassobjectpycharminstantiation

解决方案


一些 Cpython 实现是用 C 编写的,因此 PyCharm 无法导航到源代码,因为它已编译。但是,它可以并且确实显示模拟签名的存根。

3.7.3的源代码object.__new__可以在他们的 Github 存储库中找到:https ://github.com/python/cpython/blob/v3.7.3/Objects/typeobject.c#L3671-L3732


推荐阅读