Python用多元法泛化多态性
2007-03-29 12:18:17 来源:WEB开发网核心提示: 通过安排不同类型的对象来执行公共方法,我们将 分派决定移到对象中并从显式条件块中消除,Python用多元法泛化多态性(2),给定的 src 对象通过查看整个继承树知道它需要调用哪一个代码块,隐式切换仍在继续执行,而且, Foo.meth() 和 Bar.meth() 的定义内部的切换在很大
通过安排不同类型的对象来执行公共方法,我们将 分派决定移到对象中并从显式条件块中消除。给定的 src 对象通过查看整个继承树知道它需要调用哪一个代码块。隐式切换仍在继续执行,但是它针对对象 src 的类型进行。
对象 src 对于所有传递给其方法的参数享有特权。OOP 语义使该特权看起来似乎是必然的,其实不然。在许多情况下过程切换只是被置于类的方法主体中。例如,我们可以用伪 Python 实现协议兼容的类 Foo 和 Bar ,如下所示:
清单 2. Foo 和 bar 实现 .meth() 方法
class Foo:
def meth(self, arg):
if <<arg is a Foo>>:
...FooFoo code block...
elif <<arg is a Bar>>:
...FooBar code block...
class Bar:
def meth(self, arg):
if <<arg is a Foo>>:
...BarFoo code block...
elif <<arg is a Bar>>:
...BarBar code block...
# Function to utilize Foo/Bar single-dispatch polymorphism
def x_with_y(x, y):
if <<x is Foo or Bar>> and <<y is Foo or Bar>>:
x.meth(y)
else:
raise TypeError,"x, y must be either Foo's or Bar's"
调用 x_with_y() 时,可能要执行五个截然不同的代码路径/块。如果 x 和 y 的类型不合适,则给出异常(当然您还可以做别的事)。但是假定类型没问题,那么代码路径 首先由多态分派选中, 其次由过程切换选中。而且, Foo.meth() 和 Bar.meth() 的定义内部的切换在很大程度上是等同的。(单分派类型的)多态性只做了一半的工作。
更多精彩
赞助商链接