使用__del__和属性方法

时间:2017-09-25 15:46:08

标签: python python-2.7 python-3.x

属性包装器方法是python中的一个很好的特性,这个问题不是这个问题的主题,我需要知道是否可以将它与python析构函数__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

如果我们删除了属性部分,一切都顺利进行。 有人可以表明问题在哪里吗?

2 个答案:

答案 0 :(得分:3)

将删除操作添加到执行清理的媒体资源x。默认情况下,如果没有为属性定义fdel,则会引发the AttributeError you see

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

答案 1 :(得分:2)

如果您不使用@x.deleter来定义删除行为(就像您使用@x.setter所做的那样),则无法删除该属性。