class Class1(object):
...
class Class2(object):
...
class Class3(object):
...
class A(object):
def _methA(parm1, parm2)
...
def _methB(parm1, parm2)
...
def _methC(parm1, parm2)
...
def manager(parm1, method, params)
...
if parm1.__class__.__name__==Class1.__name__:
response = _methA(parm1, params)
elif parm1.__class__.__name__==Class2.__name__:
response = _methB(parm1, params)
elif io_source.__class__.__name__==Class3.__name__:
response = _methC(parm1, params)
else:
raise Exception, "Unsupported parm1"
...
Мне не понравилось, как блок if/elif
в manager()
выглядел и реорганизовал его так:
def manager(parm1, method, params)
...
try:
response = {
Class1.__name__: lambda parm1, parms: _methA(parm1, parms),
Class2.__name__: lambda parm1, parms: _methB(parm1, parms),
Class3.__name__: lambda parm1, parms: _methC(parm1, parms)
}[parm1.__class__.__name__](parm1, parms)
except KeyError:
raise Exception, "Unsupported parm1"
Но тот факт, что код все еще просматривает имена классов, беспокоит меня - я действительно не знаю, как объяснить, почему ... Должно ли это беспокоить меня?
Есть ли лучший способ написать код для вызова метода в классе A, который в зависимости от класса одного из его параметров вызывает вызов различных методов в A?
PS. Извините за надуманный пример, но размещение реального кода сделало бы вопрос еще более запутанным. Я пытался отогнать вопрос в его сути ...