Python中的自定义析构函数

Ale*_*ert 0 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))
Run Code Online (Sandbox Code Playgroud)

现在说

myData = Data()
myData.add_container('contA')
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做del myData.contA,当然不会name从中删除myData._containers

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

use*_*ica 5

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

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

def remove_container(self, name):
    self._containers.remove(name)
    delattr(self, name)
Run Code Online (Sandbox Code Playgroud)

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

def __delattr__(self, name):
    self._containers.remove(name)
    super().__delattr__(name)
Run Code Online (Sandbox Code Playgroud)