我试图更多地了解 python 类和描述符是如何工作的。我有以下代码。
class Base():
def __init__(self):
self.a = 'base_a'
def get_a(self):
return self._x
def set_a(self,val):
self._x = val
def delete_a(self):
pass
a = property(get_a,set_a,delete_a)
class Derived(Base):
def __init__(self):
Base.__init__(self)
@property
def a(self):
return 'derived_a'
t = Derived()
print(t.a)
在 Python 2.7 中运行,我得到
[carl@home tmp-carl]$ python2.7 test.py
base_a
在 Python 3.3 中运行,我得到
[carl@home tmp-carl]$ python3 test.py
Traceback (most recent call last):
File "test.py", line 25, in <module>
t = Derived()
File "test.py", line 18, in __init__
Base.__init__(self)
File "test.py", line 5, in __init__
self.a = 'base_a'
AttributeError: can't set attribute
我想我理解 Python3.3 的行为。t 是 Derived 的一个实例,因此Base::__init__
搜索t.__dict__['a']
,没有找到它。它转到Derived.__dict__['a']
,找到只读属性和错误。它永远不会成为可Base.__dict__['a']
读写的。
但如果这是真的,我完全不明白为什么 Python2.7 可以工作。似乎它完全忽略了Derived
.
谁能给我解释一下?