假设我有两个班级:
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
列表中删除名称?
答案 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