__getattr__ weirdness
Hans Nowak
hans at zephyrfalcon.org
Fri Aug 22 15:05:43 EDT 2003
Greg Brunet wrote:
> In adding the ability to refer to field values using dbfFile.field
> notation, I learned how to use __getattr__ and __setattr__ . After some
> trial and error, I got it working. But as part of my trials, I added
> some print statements to debug stuff. The ones I added to __setattr__
> work as expected, but the one in __getattr__ seems to get called just
> under 1000 times for every __getattr__ call!
Sounds like a recursive call. __getattr__ is only called for attributes that
are not defined. For example:
>>> class Foo:
def __init__(self):
self.x = 42
def __getattr__(self, name):
print "Aha, trying to access self.%s!" % (name,)
return None
>>> foo = Foo()
>>> foo.x # exists, __getattr__ isn't called
42
>>> foo.y # does not exist, __getattr__ is called
Aha, trying to access self.y!
Back to your code:
#----------------------------------------
def __init__(self,filename):
print '** __init__'
self._filename=filename
self._del=' '
self._dirty=False
self._open=False
self._rec=[]
self._recno = 1
I don't see an attribute self._fldNames here, but I see it here:
#----------------------------------------
def __getattr__(self, key):
""" Return DBF record values by field name """
print "_ga: " + key
try:
return self._rec[self._fldNames.index(key.upper())]
except:
raise AttributeError("Unknown Field: %s" % ( key ))
Most likely (I didn't actually run the code), this leads to a recursive call of
__getattr__. __getattr__ is called, tries to access self._fldNames, which
doesn't exist, so __getattr__ is called, etc. etc.
Maybe sticking a self._fldNames = something in your __init__ will solve the
problem. Then again, maybe you are trying to make that attribute dynamic
through __getattr__...?
Cheers,
--
Hans (hans at zephyrfalcon.org)
http://zephyrfalcon.org/
More information about the Python-list
mailing list