[Zope-dev] Acquisition, __getattr__ and making a Proxy/Symlink class

Shane Hathaway shane@zope.com
Wed, 26 Sep 2001 10:33:33 -0400


Lupus Yonderboy wrote:

> I have tried hooking __getattr__ and have a hard time
> avoiding recursion; I have taken a look at the
> ever-productive Shane Hathaway's TransparentFolder
> product as well but I think I am let down by my lack
> of understanding of the particulars of acquisition.


Here are a few hints for avoiding recursion in __getattr__():

- Every attribute __getattr__ accesses that is expected to be in 
self.__dict__ should also be a class attribute.

- Use self.__dict__.get().

- The "self" passed to __getattr__ is *not* wrapped, as it is for other 
methods, meaning you can't access anything in the object's context from 
__getattr__.  CMF uses a combination of __of__(), volatile attributes, 
and Zope's threading model to get around this.

Also, be sure optimize, because __getattr__ gets called *a lot*.  In 
some cases, I've measured it getting invoked hundreds of thousands of 
times in a single request!

Shane