Jonathan Livni
Jonathan Livni

Reputation: 107102

Disposing of objects with circular references

My design is as follows:

Thus a and b have circular references. However upon del a I would prefer both a and b disposed of.

I see in many places advice to use Context Managers, and specifically the with statement instead of __del__(). However all the examples I see of with start and end in local scope (e.g. of a certain method)

Can this be elegantly performed with with?
What is the alternative?

Upvotes: 2

Views: 274

Answers (3)

S.Lott
S.Lott

Reputation: 391852

What is the alternative?

Do nothing. Until you create millions of circular references like this -- and can prove that this (and only this) is breaking your program -- it doesn't actually matter.

Upvotes: 2

MatthieuW
MatthieuW

Reputation: 2372

Garbage collector is supposed to handle this.

Upvotes: 0

Eli Bendersky
Eli Bendersky

Reputation: 273526

I recommend either:

  • Using weakref - which is sometimes applicable when circular references are involved
  • or ... just manually disposing of stuff in the order you need - not in __del__ but in an explicit dispose method you call at the right time(s)

In general, when you know you have circular references, relying on automatic __del__ disposal is not a good idea. It's brittle - even if you manage to make it work in some case, small changes in dependencies can break it again.

Upvotes: 5

Related Questions