当覆盖`__delattr__`时,不会调用属性的`fdel`方法

时间:2011-07-19 09:59:03

标签: python

我有一个这样的类,我在其中声明了一个属性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__被调用,有人知道为什么以及如何解决这个问题吗?

2 个答案:

答案 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