Entry
Computing attributes on the fly (class properties)
Jul 5th, 2000 10:03
Nathan Wallace, Hans Nowak, Snippet 300, Gordon McMillan
"""
Packages: oop
"""
"""
> Yes, I definitely want to generalize that. The problem is that that
> method may be defined in a superclass, so "self.__dict__" won't find
> it. AFAIK (which may be not be very far), I have to use "hasattr"
> and/or "getattr", which in turn will call "__getattr__".
Oh, getattr isn't bad. Wait 'till you try setattr! Anyway, this
should demonstrate how to control the recursion:
"""
class X:
def __getattr__(self, nm):
print "Looking for", nm
mthdnm = "calc_%s" %nm
print "Looking in instance..."
mthd = self.__dict__.get(mthdnm, None)
if mthd is None:
print "Looking in class hierarchy..."
try:
mthd = getattr(self.__class__, mthdnm)
except AttributeError:
pass
if mthd:
val = mthd(self)
self.__dict__[nm] = val
return val
raise AttributeError("no attribute %s" % nm)
x = X()
try:
print x.foo
except AttributeError:
print "foo not found in x"
class Y(X):
def calc_foo(self):
return 33.0 * 17
y = Y()
print y.foo
print "second time..."
print y.foo
"""
Which should yield:
Looking for foo
Looking in instance...
Looking in class hierarchy...
foo not found in x
Looking for foo
Looking in instance...
Looking in class hierarchy...
561.0
second time...
561.0
"""