[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