2017-09-25 25 views
4

屬性包裝方法是一個很好的功能,在Python中,這個問題不是這樣的問題的主題,我需要知道是否有可能使用它與蟒蛇析構函數__del__,一個實用例如可以是一個數據庫連接,爲了簡化的目的,讓我們說我們有下面的類:使用具有屬性方法的__del__

class Point(object): 
"""docstring for Point""" 

def __init__(self, x, y): 
    self.x = x 
    self.y = y 

@property 
def x(self): 
    print('x getter got called') 
    return self._x 

@x.setter 
def x(self, x): 
    print('x setter got called') 
    self._x = x 

def __str__(self): 
    return '[%s:%s]' % (self.x, self.y) 

def __del__(self): 
    print('destructor got called') 
    del self.x 
    del self.y 

的測試案例,讓我們說我們有:

a = Point(4, 5) 
del a 

輸出是:

Exception AttributeError: "can't delete attribute" in <bound method Point.__del__ of <__main__.Point object at 0x7f8bcc7e5e10>> ignored 

如果我們刪除了屬性部分,一切順利。 有人可以顯示問題在哪裏?

+1

你想'德爾self._x' – salparadise

+0

這工作完全正常,你有什麼想法,有什麼更好的使用處理對象解構@ x.deleter或處理__del__方法內所有對象屬性的所有解構,第二個選項是我們寫的代碼較少。 –

+1

@ponach一般來說,你應該避免爲此使用'__del__',你可以很容易造成內存泄漏。而是使用上下文管理器。 –

回答

3

添加一個刪除器到您的屬性x清理。默認情況下,如果沒有fdel是爲屬性定義,the AttributeError you see提高:

@x.deleter 
def x(self): 
    print("x deleter got called") 
    del self._x 
+0

這很好,你有什麼想法更好地處理使用@ x.deleter的對象解構或者處理__del__方法中所有對象屬性的所有解構,第二個選項我們寫的代碼更少。 –

+1

@ponach儘管我個人不能想到在__del__中使用'del self._x'的缺點(某人可能會知道一個,我希望他們會插話),但它在語義上要優於讓屬性負責刪除它管理的屬性。 –

2

如果您不使用@x.deleter來定義刪除行爲(就像您對@x.setter所做的那樣),則無法刪除該屬性。

相關問題