method = Klass.othermethod considered PITA
Steven Bethard
steven.bethard at gmail.com
Sat Jun 4 21:35:11 EDT 2005
Erik Max Francis wrote:
> For instance, for a chat network bot framework, a certain form of bot
> will look for any attribute in its instance that starts with verb_ and a
> command and execute it when it hears it spoken:
>
> def verb_hello(self, convo):
> "Respond to a greeting."
> convo.respond(random.choice(self.greetings))
>
> If you'd like it to respond to more than one word like this, then you
> only need to assign the additional verbs, rather than redefine them:
>
> verb_hi = verb_hello
> verb_yo = verb_hello
> verb_wazzup = verb_hello
Well if you want these to work with subclasses that change verb_hello to
do something else, one option is to write a simple decorator, and then
your lines above become something like:
verb_hi = caller(verb_hello)
verb_yo = caller(verb_hello)
verb_wazzup = caller(verb_hello)
or if you prefer to only create one such function:
_verb_hello_caller = caller(verb_hello)
verb_hi = _verb_hello_caller
verb_yo = _verb_hello_caller
verb_wazzup = _verb_hello_caller
Here's a simple example in action:
py> def caller(func):
... def wrapper(self, *args, **kwargs):
... return getattr(self, func.__name__)(*args, **kwargs)
... return wrapper
...
py> class C(object):
... def verb_hello(self):
... print "C: hello"
... verb_hi = caller(verb_hello)
...
py> class D(C):
... def verb_hello(self):
... print "D: hello"
...
py> D().verb_hi()
D: hello
Notice that verb_hi() still calls verb_hello() in the subclass.
STeVe
More information about the Python-list
mailing list