WEB开发网
开发学院软件开发Python Python用多元法泛化多态性 阅读

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() 的定义内部的切换在很大程度上是等同的。(单分派类型的)多态性只做了一半的工作。

上一页  1 2 3 4 5 6 7  下一页

Tags:Python 多元 泛化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接