问题
Let's say I have two classes:
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))
Now let's say
myData = Data()
myData.add_container('contA')
Now, if I do del myData.contA
it of course doesn't remove name
from myData._containers
.
So how would I write a destructor in Container
so it deletes the attribute but also removes name from the _containers
list?
回答1:
You seem to be used to a language with deterministic object destruction and dedicated methods for performing that destruction. Python doesn't work that way. Python has no destructors, and even if it had destructors, there is no guarantee that del myData.contA
would render the Container object eligible for destruction, let alone actually destroy it.
Probably the simplest way is to just define a remove_container
paralleling your add_container
:
def remove_container(self, name):
self._containers.remove(name)
delattr(self, name)
If you really want the syntax for this operation to be del myData.contA
, then hook into attribute deletion, by implementing a __delattr__
on Data
:
def __delattr__(self, name):
self._containers.remove(name)
super().__delattr__(name)
回答2:
You want to overload the __delattr__
special method: 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
来源:https://stackoverflow.com/questions/52391850/custom-destructor-in-python