声明类变量是否与在__new__方法中声明相同?



我想知道这两种方法是否等价:

方法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

最新更新