[Zope-dev] _getOb or __getattr__?

Chris Withers chrisw@nipltd.com
Tue, 27 Feb 2001 17:37:04 +0000


Chris McDonough wrote:
> 
> > Sorry, just thought of another coupla questions:
> >
> > If x is an instance of my class, then:
> > If I do x.a = 1, is _setOb called?
> > If I do print x.a, is _getOb called?
> 
> No in either case.
> 
> _setOb shouldn't be used directly in the current ObjectManger
> implementation.  It doesn't populate the _objects list of the object manager
> on which it was called (your object won't show up).  Instead, _setObject
> should be called.

well, thankfully, I'm not going near __setattr__, _setOb or _setObject :-)
On the setting side, only __setitem__ is getting meddled with, and I'm guessing
there's not gotachas there?

Anyway, using these methods:

    # attribute - based traversal stuff
    def _getOb(self, name, default=_marker):
        print '_getOb:',name
        try:
            return higher_getOb(self,name)
        except:
            import sys
            print 'type:',sys.exc_type
            print 'value:',sys.exc_value
            raise AttributeError,name
            
        
    def __getattr__(self,name,higher_getattr=higher_getattr):
        #print '__getattr__:',name
        try:
            return higher_getattr(self,name)
        except AttributeError:
            import sys
            #print 'type:',sys.exc_type
            #print 'value:',sys.exc_value
            raise AttributeError,name

    def __getitem__(self,name,higher_getitem=higher_getitem):
        print '__getitem__:',name
        try:
            return higher_getitem(self,name)
        except KeyError:
            import sys
            #print 'type:',sys.exc_type
            #print 'value:',sys.exc_value
            raise KeyError,name

...it would appear that unrestrictedTraverse first tries to use getattr and then
tries to use getitem to get a name. That much I can veryify from the code ;-)
However, it would appear that somewhere in a __getitem__ as implemented by
ZCatalog, _getOb ends up getting called. Which is a little confusing :-S

I think I know when the __get methods get called; same as normal python right?
But when, why, how and what by does _getOb and/org _getObject and/or anything
else I might be interested about in this space get called? ;-)

Thanks loads for the help so far,

Chris