Custom destructor in Python

扶醉桌前 提交于 2019-12-11 15:45:34

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!