Python 2.0

Salvador Fandiño fandino at usa.net
Thu Jun 3 14:16:51 EDT 1999


Graham Matthews wrote:

> You don't need a new method call -- all you need is a mark and sweep
> collector with refcounts. I really am amazed that this has generated so
> much traffic. It's very simple. You have ref counts just like you do
> now in Python. When an objects refcount goes to 0 its __del__ method
> is called. On top of this you add a mark and sweep collector to handle
> circular references. During a sweep if it finds dead objects it calls
> the __del__ method for that object.

GC usually deletes objects in random order which is not a very good
behavior. With a new magic method like __gc__ you could determine
adequate entry points to ciclid data structures deletion.

Suppose you have an object DB that encapsulates a database and a
persistent object O that automatically stores itself in DB when changed:

class DB_class:
	def __del__(s): s.db_close()
	def store(s,o):
		...
	...

class O_class:
	def store(s,DB): DB.store(s)
	def __del__(s):
		if s.changed_p:
			self.DB.store(s)
	
So if you delete DB before O (that could happen if the GC behavior was
to call __del__), O will never become stored.

Adding the new method __gc__ to O_class and changing the GC behavior to
just call __gc__ solves the problem:

	def __gc__(s):
		s.__del__()
		s.DB=None


- Salva.




More information about the Python-list mailing list