类成员还在python中创建实例成员

时间:2019-03-02 17:42:50

标签: python

似乎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()

1 个答案:

答案 0 :(得分:1)

这根本不是“秘密”副本。这是预期的行为,例如在官方参考中的here3.2. The standard type hierarchy:“类实例”)中进行了讨论:

  

通过调用类对象创建类实例(请参见上文)。一个类实例具有一个实现为字典的名称空间,这是搜索属性引用的第一位。 在此处找不到属性,并且实例的类具有该名称的属性时,将继续使用该类的属性进行搜索。 [...]

通过在类实例的字典中为该属性创建一个条目,您阴影该类的属性条目。

让我们逐步介绍您的示例:

    def __init__(self):
        print(self.a)    # (1.)
        self.a = 'Hi'    # (2.)
        print(A.a)       # (3.)
  1. 属性查找从实例的属性字典开始。找不到匹配的属性,因此,查找将继续在类的属性dict处进行。找到匹配的属性a = 'hello'
  2. 使用类实例的显式分配在类实例的属性dict中创建名称为a的新属性条目。因此,该属性对于类实例是唯一的。
  3. class属性保持不变,因为它位于完全不同的字典中,即类的属性字典而不是实例。