在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的回答,我现在意识到我根本不需要写一个多方法。
答案 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"