根据参数类型在A类上调用方法

cet*_*eek 4 python oop

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.对于人为的例子感到抱歉,但发布实际代码会让问题更加复杂.我试图将问题提炼到其本质......

S.L*_*ott 5

这是实现多态的许多错误方法之一.你永远不应该看班级名称.查看班级名称应该打扰你,因为这意味着你没有正确地委派责任.

将每个方法移动到适当的类中.

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)

  • @celopes:"他们可能不是很好的理由" - 几乎是正确的.他们不是很好的理由.他们"似乎"使"Class1","Class2"和"Class3"意识到"A"的特征; 但那种判断是错误的."A"真正*的"隐藏"方法是"A"的公共接口. (2认同)