Custom destructor in Python

Viewed 1755

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?

2 Answers

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)
Related