2

这篇文章中,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 的回答,我现在意识到我实际上根本“不需要”编写多方法。

4

1 回答 1

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函数只是询问对象的长度。

在某种程度上,您可以将其视为“策略模式”

于 2013-09-03T21:28:23.990 回答