[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
>