[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