2

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
  • When it is complicited, it is often a design problem. Actually you cannot do del myData.contA has Data class has not any attribute called contA. I think you should rethink the object oriented design here Commented Sep 18, 2018 at 17:40

2 Answers 2

7

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) 
Sign up to request clarification or add additional context in comments.

Comments

0

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 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.