Finalization, Continuation and two questions about the Garbage Collector
Laurent Szyster
laurent.szyster at q-survey.be
Wed Nov 20 10:00:26 EST 2002
Hello,
Below is an implementation of the Finalization pattern and what I called
Continuation (though I'm not sure about that one), along with an test
case. The question are: in what order - if any - will the garbage
collector call the collected instances' __del__ method; in which thread
would that method be invoked?
Thanks,
Laurent Szyster
***
class Finalization:
def __call__ (self, instance):
"to subclass for chainable Finalization"
print '%r.__call__ (%r)' % (self, instance)
def finalization (self, instance):
print '%r.finalization (%r)' % (self, instance)
def __del__ (self):
if self.finalization == None:
return
finalization = self.finalization
self.finalization = None
finalization (self)
class Finalizations (Finalization):
def __init__ (self, finalizations):
self.finalizations = finalizations
def __call__ (self, instance):
for finalization in self.finalizations:
finalization (instance)
finalization = None
def continuation (finalizations):
"combines finalization instances into one execution path"
assert len (finalizations) > 1
last = finalization = finalizations.pop ()
while finalizations:
finalizations[-1].finalization = finalization
finalization = finalizations.pop ()
return finalization, last
class Continue:
finalization = None
def __init__ (self, finalizations):
self.__call__, self.last = continuation (finalizations)
def __del__ (self):
self.last.finalization = self.finalization
# Test Case
class Finalized (Finalization):
def __init__ (self, label):
self.label = label
def __repr__ (self):
return self.label
print '--- sequence'
Continue ([Finalized ('A'), Finalized ('B'), Finalized ('C')])
print '--- chainable'
Continue (
[Finalized ('1'), Finalized ('2')]
).finalization = Continue (
[Finalized ('3'), Finalized ('4'), Finalized ('5')]
)
print '--- joinable'
Continue (
[Finalized ('1'), Finalized ('2')]
).finalization = \
Continue (
[Finalized ('A'), Finalized ('B'), Finalized ('C')]
).finalization = Continue (
[Finalized ('3'), Finalized ('4'), Finalized ('5')]
)
print '--- embeddable'
Continue ([
Finalized ('A'),
Finalized ('B'),
Finalized ('C'),
Continue (
[Finalized ('1'), Finalized ('2'), Finalized ('3')]
),
Finalized ('D'),
Continue (
[Finalized ('4'), Finalized ('5'), Finalized ('6')]
)
]).finalization = Finalized ('Z')
More information about the Python-list
mailing list