撒科打诨
第一部分:__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)Foo其余时间,您不是通过Foo.__new__(Foo, ...)直接调用,而是通过调用类型本身来创建类的实例: Foo(...). 这是管理的,因为 's 元类的__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 classdef __call__(cls, *args, **kwargs): rv = cls.__new__(cls, *args, **kwargs) # Because __new__ is static! if isinstance(rv, cls): rv.__init__(*args, **kwargs) return rv请注意,__init__只有在__new__实际返回__new__首先调用的类的实例时才会调用。