python - 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
座位!!???
这有什么意义?
解决方案
一些 Cpython 实现是用 C 编写的,因此 PyCharm 无法导航到源代码,因为它已编译。但是,它可以并且确实显示模拟签名的存根。
3.7.3的源代码object.__new__
可以在他们的 Github 存储库中找到:https ://github.com/python/cpython/blob/v3.7.3/Objects/typeobject.c#L3671-L3732
推荐阅读
- javafx-2 - 如何在javafx中加粗和更改tableview项目或行的字体大小?
- dns - 了解 Pingdom DNS 测试结果
- python - 'ToastNotifier' 对象没有属性 'classAtom'
- node.js - firestore nodejs解析错误:意外的令牌
- jquery - 重新加载页面后保持活动的 jQuery UI 选项卡和与其相关的子选项卡
- php - PHP Openssl_pkey_get_private() 结果取决于 openssl
- c# - 在 Linux 中,找不到框架“.NETFramework,Version=v4.5”的参考程序集
- php - 在多个堆叠特征中链接相同的方法
- javascript - jQuery:如何使进度条从一种颜色变为另一种颜色
- javascript - 自定义控件的 HTML 项 - cognos 11.0.7