所以我有這樣的:特殊性覆蓋的屬性二傳手
class Parent(object):
def __init__(self, val):
print 'enter Base init'
self._set_x(val)
print 'leave Base init'
def _get_x(self):
return self._x
def _set_x(self, val):
print 'enter Base _set_x'
self._x = val
print 'leave Base _set_x'
x = property(_get_x, _set_x)
class Child(Parent):
def _set_x(self, val):
print 'enter Child _set_x'
y = val * 2
super(Child, self)._set_x(y)
print 'leave Child _set_x'
child = Child(5)
num = child.x
child.x = 5
print num == child.x
當我運行它,我得到這個:
enter Base init
enter Child _set_x
enter Base _set_x
leave Base _set_x
leave Child _set_x
leave Base init
enter Base _set_x
leave Base _set_x
False
我一直在看四周,人們說壓倒一切不應該工作,但我的問題是爲什麼這裏看起來不一致呢?當從init調用子類時,子類的setter會被調用,但是當你稍後作用於已經初始化的對象時,它會調用基礎的setter。有人可以解釋這裏發生了什麼嗎?
啊,我明白了。因爲即使在父母的初始範圍內,它仍然會看着設置者的完整的孩子自我。我在想,基類的init方法在沒有額外工作的情況下不會找到孩子的setter,但現在我想到了它,當然這是有道理的。謝謝。 – 2012-02-14 19:26:45