2011-07-19 39 views
1

我有這樣的一類,在我所聲明的屬性x,並覆蓋__delattr__一個屬性的`fdel`方法不會被調用時,`__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

您必須致電您祖先的__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 
+0

請你給我一個鏈接到一些相關的文件? – satoru

+0

@ Satoru.Logic:類似於http://docs.python.org/library/functions.html#super? –

2

_del_x從默認的__del_attr__被調用。但由於您已覆蓋__del_attr__,因此您有責任從__del_attr__內撥打電話_del_x