[Zope-dev] How to override __getattr__ and not break acquisition

John Barratt jjb@vivitec.com.au
Thu, 17 Oct 2002 19:57:40 +1000


Oliver,
	Thanks for the reply.

Oliver Bleutgen wrote:
> > def __getattr__(self,attr):
> >   if name = 'foo':
> >     return self.foo()
> >
> >   return Implicit.__class__.__getattr__(self,attr)
> 
> If you really want to do just that, take a look at ComputedAttribute,
> just in case you don't know.
> 
> foo = ComputedAttribute(_foo)
> def _foo(self,..):
>      <do something>
>      return something

I perhaps should have clarified that I need to be able to specify the
name of the attributes or methods at run time, so ComputedAttribute
unfortunately won't do the trick as you have to define each
attribute/method you require in the class definition.

ie. I need something like :
def __getattr__(self,attr):
   if name in self.methodlist:
     <do something>
   return Implicit.__class__.__getattr__(self,attr)

where self.methodlist is a list of strings that may change per instance
and/or at runtime, or itself could be calculated at the time of doing
the __getattr__ (eg self.getMethodList()).

One other way that may work is to be able to set methods on the object
as it comes out of the ZODB for use, as I need to be able to get methods
from other objects in the ZODB, something to explore... Anyone have any
pointers on this one perhaps?

Thanks,

JB.