Python中的自定义析构函数

时间:2018-09-18 17:30:40

标签: python destructor

假设我有两个班级:

class Container():
   def __init__(self, name):
       self.name = name

class Data():
   def __init__(self):
     self._containers = []

   def add_container(self,name):
     self._containers.append(name)
     setattr(self, name, Container(name))

现在让我们说

myData = Data()
myData.add_container('contA')

现在,如果我执行del myData.contA,那么它当然不会从name中删除myData._containers

那么我该如何在Container中编写一个析构函数,以便它删除属性,但又从_containers列表中删除名称?

2 个答案:

答案 0 :(得分:4)

您似乎习惯于使用确定性对象销毁以及专用于执行该销毁方法的语言。 Python不能那样工作。 Python没有析构函数,即使有析构函数,也无法保证del myData.contA可以使Container对象具有销毁的资格,更不用说实际销毁它了。

可能最简单的方法是只定义与remove_container平行的add_container

def remove_container(self, name):
    self._containers.remove(name)
    delattr(self, name)

如果您确实希望此操作的语法为del myData.contA,则可以通过在__delattr__上实现Data来挂接属性删除:

def __delattr__(self, name):
    self._containers.remove(name)
    super().__delattr__(name)

答案 1 :(得分:0)

您想重载__delattr__特殊方法:https://docs.python.org/3/reference/datamodel.html#object.delattr

class Data:
    [...]
    def __delattr__(self, key):
        super().__delattr__(name)
        #find and remove the Container from _containers