faqts : Computers : Programming : Languages : Python : Snippets

+ Search
Add Entry AlertManage Folder Edit Entry Add page to http://del.icio.us/
Did You Find This Entry Useful?

2 of 2 people (100%) answered Yes
Recently 1 of 1 people (100%) answered Yes

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
"""