Python用多元法泛化多态性
2007-03-29 12:18:17 来源:WEB开发网核心提示: 新规则的定义(和对函数/方法的支持)在很大程度上是等同的,但是多分派样式的巨大优势在于您可以用它来无缝地合并未知类型的形状,Python用多元法泛化多态性(7),无需回头使用显式的(和冗长的)条件块,而是用规则定义自动处理问题,您几乎总是在子代方法主体的开始或结束部分调用超类方法,对于对不
新规则的定义(和对函数/方法的支持)在很大程度上是等同的。但是多分派样式的巨大优势在于您可以用它来无缝地合并未知类型的形状。无需回头使用显式的(和冗长的)条件块,而是用规则定义自动处理问题。更好的做法是,所有合并都用单个可调用 combine() 完成,而不需要使用各式各样的合并方法。
分派传播
无需深入研究分派, multimethods.Dispatch 类将为给定分派器调用选择“最合适”的分派。但是,有时候需要注意:“最好的”并非是“唯一的”。也就是说, dispatch(foo,bar) 调用可能是采用已定义规则 (Foo,Bar) 的较合适的分派,但是也可能与 (FooParent,BarParent) 规则松散(并不是不)配合。就像您有时想对继承方法中的超类方法进行调用一样,您有时还想在分派器内对不太特定的规则进行调用。
multimethods 模块提供了调用不太特定的规则的一条捷径和一种更为精调的方式。在粗糙的层次上,您通常只想在开始或结束执行代码块时自动调用不太特定的规则。同样,您几乎总是在子代方法主体的开始或结束部分调用超类方法。对于对不太特定的方法常见的开始/结束调用,您就可以将那指定为规则的一部分。例如:
清单 7. 自动的分派传播
class General(object): pass
class Between(General): pass
class Specific(Between): pass
dispatch = Dispatch()
dispatch.add_rule((General,), lambda _:"Gen", AT_END)
dispatch.add_rule((Between,), lambda _:"Betw", AT_END)
dispatch.add_rule((Specific,), lambda _:"Specif", AT_END)
dispatch(General()) # Result: ['Gen']
dispatch(Specific()) # Result: ['Specif', 'Betw', 'Gen']
更多精彩
赞助商链接