Disposing of objects with circular references
My design is as follows:
__main__
referencesa
a
referencesb
b
referencesa
a
is created and then disposed of from__main__
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 lo开发者_JAVA技巧cal scope (e.g. of a certain method)
Can this be elegantly performed with with
?
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 explicitdispose
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.
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.
Garbage collector is supposed to handle this.
精彩评论