我想知道这两种方法是否等价:
方法1
class A:
toto = 1
vs,方法2:
class A:
def __new__(cls, *args, **kwargs):
cls.toto = 1
return super().__new__(cls, *args, **kwargs)
对我来说他们看起来一样。特别是,打印dir(A)
会得到相同的结果:
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
...
'toto']
感谢不,它们是不相等的。
方法1只设置类变量一次。方法2设置它可能为0或多次,与实例化A
对象的次数相同。
考虑最简单的情况:
>>> class A:
... toto = 1
...
>>> print(A.toto)
1
然而:
>>> class A:
... def __new__(cls, *args, **kwargs):
... cls.toto = 1
... return super().__new__(cls, *args, **kwargs)
...
>>> print(A.toto)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'A' has no attribute 'toto'
现在考虑一个更复杂的情况:
>>> class A:
... toto = 1
...
>>> a = A()
>>> A.toto = 42
>>> a = A()
>>> print(A.toto)
42
然而:
>>> class A:
... def __new__(cls, *args, **kwargs):
... cls.toto = 1
... return super().__new__(cls, *args, **kwargs)
...
>>> a = A()
>>> A.toto = 42
>>> a = A()
>>> print(A.toto)
1