访问Python中的静态属性
我对Python还比较陌生,希望有人能给我解释一下以下内容:
class MyClass:
Property1 = 1
Property2 = 2
print MyClass.Property1 # 1
mc = MyClass()
print mc.Property1 # 1
为什么我可以通过类名直接访问Property1,也可以通过MyClass的实例访问它呢?
1 个回答
30
这段代码
class MyClass:
Property1 = 1
创建了一个叫做 MyClass
的类,这个类里面有一个字典:
>>> MyClass.__dict__
{'Property1': 1, '__doc__': None, '__module__': '__main__'}
注意这个键值对 'Property1': 1
。当你输入 MyClass.Property1
时,Python 会在字典 MyClass.__dict__
中查找键 Property1
,如果找到了,就会返回对应的值 1
。
>>> MyClass.Property1
1
当你创建这个类的一个实例时,
>>> mc = MyClass()
这个实例也会有一个字典:
>>> mc.__dict__
{}
注意这个字典是空的。当你输入 mc.Property1
时,Python 首先会在 mc.__dict__
中查找 'Property1'
这个键。因为在这里找不到,所以它会去查找 mc
所属类的字典,也就是 MyClass.__dict__
。
>>> mc.Property1
1
需要注意的是,关于 Python 属性访问 的内容还有很多(比如我还没有提到关于描述符的重要规则)。不过上面的内容已经解释了大多数常见的属性访问规则。