实例属性归类的特定实例所有。也就是说,对于两个不同的实例,实例属性通常是不同的。您现在应该熟悉我们在前一章中介绍的这个概念。
我们还可以在类级别定义属性。类属性是类本身拥有的属性。它们将由类的所有实例共享。因此,它们对每个实例都具有相同的值。我们在所有方法之外定义类属性,通常它们位于顶部,类标题的正下方。
在下面的交互式 Python 会话中,我们可以看到所有实例的类属性“a”都是相同的,在我们的示例“x”和“y”中。除此之外,我们看到我们可以通过实例或通过类名访问类属性:
A类:
a = “我是一个类属性!”
x = A ()
y = A ()
x 。一个
输出:
“我是阶级属性!”
y 。一个
输出:
“我是阶级属性!”
一个。一个
输出:
“我是阶级属性!”
但要小心,如果你想改变一个类的属性,你必须用 ClassName.AttributeName 表示法来做。否则,您将创建一个新的实例变量。我们在以下示例中演示了这一点:
A类:
a = “我是一个类属性!”
x = A ()
y = A ()
x 。a = "这会为 x 创建一个新的实例属性!"
y 。一个
输出:
“我是阶级属性!”
一个。一个
输出:
“我是阶级属性!”
一个。a = "这正在改变类属性 'a'!"
一个。一个
输出:
“这正在改变类属性'a'!”
y 。一个
输出:
“这正在改变类属性'a'!”
× 。a
# 但 xa 仍然是之前创建的实例变量
输出:
'这为 x 创建了一个新的实例属性!'
Python 的类属性和对象属性存储在不同的字典中,我们可以在这里看到:
× 。__dict__
输出:
{'a': '这会为 x 创建一个新的实例属性!'}
y 。__dict__
输出:
{}
一个。__dict__
输出:
mappingproxy({'__module__': '__main__',
'a': "这正在改变类属性 'a'!",
'__dict__': <属性 '__dict__' of 'A' 对象>,
'__weakref__': <属性 '__weakref__' of 'A