所以我有这样的:特殊性覆盖的属性二传手
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