[Zope] Subclassing from Custom Python Classes

Chris McDonough chrism@digicool.com
Wed, 24 May 2000 21:56:32 -0400


This is a good question that I'm not sure of the completely technically
correct answer to.  But here's my best shot.  Part of what composes a
"Zope object" is that the object inherits characteristics from the
"Persistence.Persistent" class.  This base class overrides Python's
normal __setattr__ and __getattr__ instance methods.  When a persistent
object is queried for a subobject (e.g. its __getattr__ is called), it
does some magic to pull that subobject out of persistent storage.
Likewise, when you attach an attribute to an object (e.g. its
__setattr__ is called), this base class does its thing and when a
transaction is committed, the object is written out to the ZODB.
Because mutable objects have methods that do an end-run around
__setattr__ (such as list.append, dict.__setitem__, etc.), Zope won't
know that the object has changed because setattr never gets called.
However, when you do the persistence shuffle (ala m=self.map;
m['foo']=bar; self.map=m), __setattr__ does get called on the parent
object, and Zope therefore knows the object has been changed.

Others may elaborate or correct, I'm certain. 

> -----Original Message-----
> From: Pete Kazmier [mailto:pete@kazmier.com]
> Sent: Wednesday, May 24, 2000 8:32 PM
> To: zope@zope.org
> Cc: chrism@digicool.com
> Subject: Re: [Zope] Subclassing from Custom Python Classes
> 
> 
> Thank you for the useful information!!
> 
> I do have one more question regarding your persistence comments.  How
> does using a temporary name notify the Zope persistence machinery that
> self.map has changed?  Doesn't 'self.map=m' do nothing in Python if
> one already did a 'm=self.map'?  In the end, aren't they referencing
> the exact same object?  Hows does Zope know its different?
> 
> Thanks again,
> Pete
>