[Tutor] Calling instance method using a string

Bernard Lebel 3dbernard at gmail.com
Thu Nov 9 18:53:18 CET 2006


Thanks everyone for the advice.


Bernard



On 11/9/06, Danny Yoo <dyoo at hkn.eecs.berkeley.edu> wrote:
> >> Say I have class A:
> >>
> >> class A:
> >>     def myMethod( self ):
> >>         print 'foo'
> >>
> >> a = A()
> >
> > getattr(a, 'myMethod')()
> >
> > The getattr() call gets the bound method, the extra parentheses at the
> > end call it.
>
>
> Hi Bernard,
>
> You can also do this in a controlled manner by treating the methods as
> functions, and using a dispatch table.  Concretely:
>
> #########################################################
> class TestDispatch:
>      def add(self, x, y):
>          return x + y
>
>      def sub(self, x, y):
>          return x - y
>
>      def dontcallme(self):
>          return "oh no"
>
>      def dispatch(self, msg, *args):
>          table = {"add" : self.add,
>                   "sub" : self.sub}
>          if msg in table:
>              return table[msg](*args)
>          print "Unrecognized message:", msg
>          return None
>
> def test():
>      calc = TestDispatch()
>      msg = None
>      while msg != 'quit':
>          msg = raw_input('cmd? ')
>          print calc.dispatch(msg, 3, 4)
> #########################################################
>
> Try running test(), and then enter either "add" or "sub" at the prompt.
>
> This approach differs from getattr() because we can prevent clients from
> calling dontcallme() by excluding it from our dispatch table, so it's more
> controlled.  Also, it's a techinque that's pretty programming-language
> agnostic.  However, it is a little more verbose than the equivalent
> getattr()-driven code.
>


More information about the Tutor mailing list