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"
...
Run Code Online (Sandbox Code Playgroud)
我不喜欢看到的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"
Run Code Online (Sandbox Code Playgroud)
但是代码仍然在看类名的事实困扰着我 - 我真的不知道如何解释为什么...... 它应该打扰我吗?
是否有更好的方法来编写代码来调用类A中的方法,根据其中一个参数的类,它会触发在A中调用不同的方法?
PS.对于人为的例子感到抱歉,但发布实际代码会让问题更加复杂.我试图将问题提炼到其本质......
这是实现多态的许多错误方法之一.你永远不应该看班级名称.查看班级名称应该打扰你,因为这意味着你没有正确地委派责任.
将每个方法移动到适当的类中.
class Class1(object):
def method( self, theA, params ):
theA.methA( params )
class Class2(object):
def method( self, theA, params ):
theA.methB( params )
class Class3(object):
def method( self, theA, params ):
theA.methC( params )
class A(object):
def methA(parm1, parm2)
...
def methB(parm1, parm2)
...
def methC(parm1, parm2)
...
def manager(parm1, method, params)
...
param1.method( self, params )
Run Code Online (Sandbox Code Playgroud)