我是 python 新手,了解到类属性就像 C++ 中的静态数据成员。但是,在尝试以下代码后我感到困惑:
>>> class Foo:
... a=1
...
>>> f1=Foo();
>>> f2=Foo()
>>> f1.a
1
>>> f1.a=5
>>> f1.a
5
>>> f2.a
1
f2.a 不应该也等于 5 吗?
如果 a 被定义为列表而不是整数,则预期行为为:
>>> class Foo:
... a=[]
...
>>> f1=Foo();
>>> f2=Foo()
>>> f1.a
[]
>>> f1.a.append(5)
>>> f1.a
[5]
>>> f2.a
[5]
我在看Python:类属性和实例属性之间的区别 https://stackoverflow.com/questions/207000/python-difference-between-class-and-instance-attributes,但它没有回答我的问题。
谁能解释为什么会有这样的差异?谢谢
Python类属性和对象属性是分开存储的字典 http://docs.python.org/tutorial/datastructures.html#dictionaries。对于对象f1
,这些可以分别通过以下方式访问:f1.__class__.__dict__
and f1.__dict__
。执行中print f1.__class__ is Foo
将输出True
.
当你引用一个对象的属性时,Python 首先尝试在对象字典中查找它。如果在那里找不到它,它会检查类字典(依此类推继承层次结构)。
当您分配给f1.a
,您正在向对象字典添加一个条目f1
。后续查找f1.a
将找到该条目。查找f2.a
仍然会找到类属性——类属性字典中的条目。
你可以导致的价值f1.a
恢复到1
通过删除它:
del f1.a
这将删除条目a
在对象字典中f1
,后续查找将继续到类字典。所以,后来,print f1.a
将输出1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)