我有一个这样的类,我在其中声明了一个属性x
,并覆盖了__delattr__
:
class B(object):
def __init__(self, x):
self._x = x
def _get_x(self):
return self._x
def _set_x(self, x):
self._x = x
def _del_x(self):
print '_del_x'
x = property(_get_x, _set_x, _del_x)
def __delattr__(self, name):
print '__del_attr__'
现在我跑
b = B(1)
del b.x
只有__del_attr__
被调用,有人知道为什么以及如何解决这个问题吗?
答案 0 :(得分:2)
_del_x
调用 __del_attr__
。但是,由于您已覆盖__del_attr__
,因此您有责任从_del_x
内拨打__del_attr__
。
答案 1 :(得分:2)
您必须致电祖先的__delattr__
才能正确实现此目的。
class B(object):
.....
def __delattr__(self, name):
print '__del_attr__'
super(B, self).__delattr__(name) # explicit call to ancestor (not automatic in python)
然后跑步:
b = B(1)
del b.x
将输出:
__del_attr__
_del_x