2017-09-25 130 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所做的那样),则无法删除该属性。

相关问题