Python用多元法泛化多态性
2007-03-29 12:18:17 来源:WEB开发网核心提示: Dispatch 实例是个可调用对象,可以用数量不限的规则来配置它,Python用多元法泛化多态性(4),还可以用方法 Dispatch.remove_rule() 来删除规则,这使得使用 multimethods 的多分派比静态类层次结构更加具有动态性(但是您也可以在运行时用 Pytho
Dispatch 实例是个可调用对象,可以用数量不限的规则来配置它。还可以用方法 Dispatch.remove_rule() 来删除规则,这使得使用 multimethods 的多分派比静态类层次结构更加具有动态性(但是您也可以在运行时用 Python 类做一些隐秘的事)。还要注意的是, Dispatch 实例可以接受数目不定的参数;首先对参数的数目进行匹配,其次是其类型。如果用规则中不曾定义的任何模式来调用 Dispatch 实例,则出现 TypeError 。如果您只想在遇到未定义的情况时抛出异常,那么就没必要使用落后的 (object,object) 模式对 x_with_y() 进行初始化。
只要将 Dispatch 的初始化调用中所列出的每个 (pattern,function) 元组传递给 .add_rule() 方法;在初始化时建立规则还是在后来建立规则,程序员觉得哪种方便就采用哪种(可以将它们进行混合再匹配,就像前面的示例那样)。从分派器调用函数时,将调用分派器中使用的参数传递给该函数;您需要确保您使用的函数可以接受与该函数匹配的参数数目。例如,以下这两种调用是等价的:
清单 4. 显式的和分派的函数调用
# Define function, classes, objects
def func(a,b): print "The X is", a, "the Y is", b
class X(object): pass
class Y(object): pass
x, y = X(), Y()
# Explicit call to func with args
func(x,y)
# Dispatched call to func on args
from multimethods import Dispatch
dispatch = Dispatch()
dispatch.add_rule((X,Y), func)
dispatch(x,y) # resolves to 'func(x,y)'
显然,如果您在设计时就已经知道 x 和 y 的类型,那么建立分派器的机制就是多余的。但是,多态性也具有同样的限制 - 它只在您不能对于每个执行路径将对象约束为单个类型时才有所帮助。
更多精彩
赞助商链接