[Tutor] dictionary dispatch for object instance attributes question

Kent Johnson kent37 at tds.net
Sun Feb 20 13:26:54 CET 2005


Liam Clarke wrote:
> Hi, 
> 
> just an expansion on Brian's query, is there a variant of getattr for
> instance methods?
> 
> i.e. class DBRequest:
>     def __init__(self, fields, action):
>         self.get(fields)
>     
>     def get(self, fields):
>         print fields
> 
> 
> Instead of self.get in _init__, the value of action to call a
> function? Or, is it going to have to be dictionary dispatch?

I don't understand your example, but instance methods are attributes too, so getattr() works with 
them as well as simple values.

An instance method is an attribute of the class whose value is a function. When you access the 
attribute on an instance you get something called a 'bound method' which holds a reference to the 
actual function and a reference to the instance (to pass to the function as the 'self' parameter). 
You can call a bound method just like any other function. So:

  >>> class foo:
  ...   def __init__(self):
  ...     self.bar = 3
  ...   def baz(self):
  ...     print self.bar
  ...
  >>> f=foo()

getattr() of a simple attribute:
  >>> getattr(f, 'bar')
3

getattr() of an instance method returns a 'bound method':
  >>> getattr(f, 'baz')
<bound method foo.baz of <__main__.foo instance at 0x008D5FD0>>

Calling the bound method (note the added ()) is the same as calling the instance method directly:
  >>> getattr(f, 'baz')()
3

Of course you can do the same thing with dot notation for attributes:
  >>> b=f.baz
  >>> b
<bound method foo.baz of <__main__.foo instance at 0x008D5FD0>>
  >>> b()
3

Kent



More information about the Tutor mailing list