使用isinstance的Python多方法

时间:2013-09-03 21:23:07

标签: python multimethod

this article中,Guido van Rossum说Python中的这种多方法实现:

def foo(a, b):
    if isinstance(a, int) and isinstance(b, int):
        ...code for two ints...
    elif isinstance(a, float) and isinstance(b, float):
        ...code for two floats...
    elif isinstance(a, str) and isinstance(b, str):
        ...code for two strings...
    else:
        raise TypeError("unsupported argument types (%s, %s)" % (type(a), type(b)))

“乏味”,“不是非常OO”。然后,他将介绍如何使用装饰器来实现多方法,我认为那些没有相当深入的Python知识的人将无法访问这些方法。

我的问题:我需要编写一个多方法,对于上面的代码实际上“不是OO”?

更新:根据Thomas Orozco的回答,我现在意识到我根本不需要写一个多方法。

1 个答案:

答案 0 :(得分:4)

不是检查传递给方法的对象的类型,而是让对象实现逻辑本身。

让我们举个例子:len函数。

本机实现将是:

def len(x):
    if type(x) == str:
        # compute the length of a string
    elif type(x) == list:
        # compute the length of a list
    else:
        #

但这有一些警告

  • 如果不重新实施len
  • ,您无法在自己的对象中支持len
  • 这是一个巨大的,难以理解的混乱

最重要的是,关于它的OO部分,它意味着你的str的实现分散在你的代码库中:用于计算其长度的代码在这里,用于切片的代码在其他地方。 ..


相反,更加理智的设计是Python中使用的设计:

def len(x):
    return x.__len__()

然后由每个对象来实现__len__方法本身。 len函数只询问对象的长度。

在某种程度上,您可以将其视为"Strategy Pattern"