方法重载python

时间:2013-01-12 21:41:53

标签: python operator-overloading

这类似于方法重载。当print Hello(1, 2, 3)执行时,它会返回"a and b",而我希望它返回"a and b and c"。我知道我可以说if (a and b and c is None)然后它会起作用。但是如果我有20个参数并且我必须处理每个案例,那么只有多个if语句我认为不应该是必要的。我有更好的方法来做这样的问题吗?

 def Hello(a=None, b=None, c=None):
    if(a and b):
        return "a and b"
    if(a and c):
       return "a and c"
    if(a and b and c):
       return "a and b and c"

print Hello(1, 2, 3)

3 个答案:

答案 0 :(得分:4)

您需要重新排序if语句:

 def Hello(a=None, b=None, c=None):
    if a and b and c:
       return "a and b and c"
    if a and b:
        return "a and b"
    if a and c:
       return "a and c"

a and b and c评估为true时,a and b也会计算为true,因此在您的代码中,此案例由第一个if处理。

答案 1 :(得分:3)

你需要重新考虑你的程序逻辑。通常,API 具有所有可选参数,您需要从所有输入构建大型决策树。

换句话说,在实际程序中,您通常不会遇到一种功能,其中每种不同的输入组合的行为完全不同。总是,即使对于大量可选参数,合法组合也要小得多。

对于您的玩具示例,您可以提出其他方法来创建不涉及决策树的返回值:

  • 地图回复:

    responsemap = {
        (True,  True,  False): "a and b",
        (True,  False, True):  "a and c",
        (True,  True,  True):  "a and b and c"
    }
    
    def Hello(a=None, b=None, c=None):
        return responsemap.get((bool(a), bool(b), bool(c)), None)
    
  • 根据输入构建字符串:

    def Hello(a=None, b=None, c=None):
        return ' and '.join([n for n in ('a', 'b', 'c') if locals()[n]])
    

答案 2 :(得分:1)

python不支持方法重载。我们可能会重载这些方法,但只能使用最新定义的方法

def product(a, b):
    return a*b

def product(a,b,c):
    return a*b*c

如果您致电product(10, 20)会出错