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