简而言之,来自Python,
Where C is a class, the statement
x=C(23)
is equivalent to:x = C.__new__(C, 23) if isinstance(x, C): type(x).__init__(x, 23)
根据我的理解,object.__new__
创建一个新的、未初始化的类实例,它接收作为第一个参数。
为什么需要使用isinstance()
进行检查。显然 __new__
将返回一个 C
类型的对象。
如果是的话,如果测试失败会发生什么?
由于类
是可调用
,因此对__new__
的调用是在类的__call()__
中完成的方法
我是否遗漏了什么,请向我澄清
最佳答案
Isn't it obvious that
__new__
will return a object of type C.
一点也不。以下内容有效:
>>> class C:
... def __new__(cls):
... return "not a C"
... def __init__(self):
... print("Never called")
...
>>> C()
'not a C'
当您重写 __new__
时,您可能会返回 cls
的实例,但您不是必需的> 到。这对于定义工厂类非常有用,工厂类不会创建自身的实例,而是创建其他类的实例。
请注意,您引用的内容不太准确。在第一步,x = C(32)
相当于 x = type.__call__(C, 32)
。是type.__call__
调用C.__new__
,然后决定是否调用返回值的__init__
方法。
您可以将 type.__call__
视为类似的定义
def __call__(cls, *args, **kwargs):
obj = cls.__new__(cls, *args, **kwargs)
if isinstance(obj, cls):
obj.__init__(*args, **kwargs)
return obj
将此应用于C
,我们看到obj
被设置为str
值'not a C'
,不是 C
的实例,因此在返回字符串之前不会调用 'not a C'.__init__
。
关于python - 当我们调用一个类时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61698002/