[Tutor] Problem with calling class methods stored in a list

Peter Otten __peter__ at web.de
Thu Jan 10 13:48:33 CET 2013


Tobias M. wrote:

> Peter Otten wrote:
>> Build the list outside the class: MyClass.method_list = [MyClass.bar]
> Thanks, that is a solution. But I don't really like to put the list
> outside the class as it is strongly related to the class and not used
> outside.

> Actually in my code it's not a list but a dictionary. The class is part 

Well, I usually prefer to keep things simple, but you can do the binding 
manually:

>>> class A(object):
...     @classmethod
...     def foo(cls):
...             print "Hello from A.foo()"
...     lookup = {"foo": foo}
...     @classmethod
...     def get_handler(cls, packet_type):
...             return cls.lookup[packet_type].__get__(None, cls)
... 
>>> A.get_handler("foo")()
Hello from A.foo()

If you adopt this approach you might omit the lookup dictionary and use 
getattr():

>>> class B(object):
...     @classmethod
...     def handle_foo(cls): print "Hello from B.handle_foo()"
...     @classmethod
...     def get_handler(cls, packet_type):
...             return getattr(cls, "handle_" + packet_type)
... 
>>> B.get_handler("foo")()
Hello from B.handle_foo()

(I've added the "handle_" prefix so an attacker can't just invent package 
types to have arbitrary methods invoked.)



More information about the Tutor mailing list