似乎python类成员也被“秘密地”复制到实例成员,我从未听说过。这是在某处描述的吗?
这是我研究的一个小例子(python 3.6.7 ubuntu 18:04)。
class A:
a = 'hello' # class member
def __init__(self):
print(self.a) # a has also become a instance member
self.a = 'Hi' # change the instance member of a
print(A.a) # class member a unchanged
a = A()
答案 0 :(得分:1)
这根本不是“秘密”副本。这是预期的行为,例如在官方参考中的here(3.2. The standard type hierarchy
:“类实例”)中进行了讨论:
通过调用类对象创建类实例(请参见上文)。一个类实例具有一个实现为字典的名称空间,这是搜索属性引用的第一位。 在此处找不到属性,并且实例的类具有该名称的属性时,将继续使用该类的属性进行搜索。 [...]
通过在类实例的字典中为该属性创建一个条目,您阴影该类的属性条目。
让我们逐步介绍您的示例:
def __init__(self):
print(self.a) # (1.)
self.a = 'Hi' # (2.)
print(A.a) # (3.)
a = 'hello'
。a
的新属性条目。因此,该属性对于类实例是唯一的。