Я бы, вероятно, сделал что-то вроде этого:
def register(dict_, *names):
def dec(f):
m_name = f.__name__
for name in names:
dict_[name] = m_name
return f
return dec
class Test(object):
commands = {}
@register(commands, 'foo', 'fu', 'fOo')
def _handle_foo(self):
print 'foo'
@register(commands, 'bar', 'BaR', 'bAR')
def _do_bar(self):
print 'bar'
def dispatch(self, cmd):
try:
return getattr(self, self.commands[cmd])()
except (KeyError, AttributeError):
# Command doesn't exist. Handle it somehow if you want to
# The AttributeError should actually never occur unless a method gets
# deleted from the class
Теперь класс предоставляет dict
, чьи ключи являются командами для проверки членства.Все методы и словарь создаются только один раз.
t = Test()
if 'foo' in t.commands:
t.dispatch('foo')
for cmd in t.commands:
# Obviously this will call each method with multiple commands dispatched to it once
# for each command
t.dispatch(cmd)
И т. Д.