Ign*_*cio 3 python class-constructors default-constructor python-3.x
我相信我对应该做什么有某种理解__new__(创建一个类的实例,但不初始化它,这是 的工作__init__)。但是,我想了解 Python 3__new__默认实现的方法。
我还发现它cls是 的一个参数有点令人困惑__new__,但它__new__是一个静态方法而不是一个类方法(我从文档中得到了这个)......现在它如何作为它的第一个参数传递一个类型?
第一部分:__new__默认情况下做什么?因为从头开始创建对象是一个基本的、特定于实现的操作,所以 的定义object.__new__(与 的其余定义一样object)是实现本身的一部分。这意味着您需要查看 CPython、PyPy、Cython 等的源代码,以确切了解在 Python 的任何特定实现中如何管理对象创建。通常,这些都是无法从 Python 本身直接访问的低级簿记。
第二部分:如何__new__知道它得到了一个类参数?因为它假设它的第一个参数是一个类,如果调用者希望__new__正常工作,最好提供一个类!就是说,没有人真正地__new__明确调用,除了通过super覆盖__new__, 然后,您必须确保cls自己明确传递:
def __new__(cls, *args, **kwargs):
rv = super().__new__(cls, *args, **kwargs) # Not super().__new__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
其余时间,您Foo不是通过Foo.__new__(Foo, ...)直接调用,而是通过调用类型本身来创建类的实例:Foo(...)。这是管理的,因为的元类的__call__方法Foo负责调用__new__您的。例如,您可以想象type.__call__大致定义为
# A regular instance method of type; we use cls instead of self to
# emphasize that an instance of a metaclass is a class
def __call__(cls, *args, **kwargs):
rv = cls.__new__(cls, *args, **kwargs) # Because __new__ is static!
if isinstance(rv, cls):
rv.__init__(*args, **kwargs)
return rv
Run Code Online (Sandbox Code Playgroud)
请注意,__init__只有在__new__实际返回__new__首先调用的类的实例时才会调用。
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |