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

Python用多元法泛化多态性

 2007-03-29 12:18:17 来源:WEB开发网   
核心提示: 当然,在某些情况中(比如 (General) 规则),Python用多元法泛化多态性(8),在已定义规则中没有什么是不太特定的,但是为了一致性,那就更不在话下了,但是应用它一段时间后,每次调用分派器都会返回一个从控制传播内容的所有函数中返回的返回值列表,如果在规则中既没有指定 AT_END

当然,在某些情况中(比如 (General) 规则),在已定义规则中没有什么是不太特定的。但是为了一致性,每次调用分派器都会返回一个从控制传播内容的所有函数中返回的返回值列表。如果在规则中既没有指定 AT_END 也没有指定 AT_START ,那么就不会发生传播(而且返回列表长度为 1)。这说明了 [0] 索引在形状示例中或许看上去很神秘的原因。

精调的传播控制方式就是使用分派器的 .next_method() 方法。为了利用手工传播,您应当使用 .add_dispatchable() 方法而不是 .add_rule() 方法来定义规则。分派函数自身最好还是应当接受 dispatch 参数。调用分派器需要一个分派参数,或者您可以使用 .with_dispatch() 这一便利方法。例如:

清单 8. 用手工传播进行编程

def do_between(x, dispatch):
 print "do some initial stuff"
 val = dispatch.next_method() # return simple value of up-call
 print "do some followup stuff"
 return "My return value"
foo = Foo()
import multimethods
multi = multimethods.Dispatch()
multi.add_dispatchable((Foo,), do_between)
multi.with_dispatch(foo)
# Or: multi(foo, multi)

调用超类方法的许多方式很棘手,而以同样方式对较为不特定的多元法所进行的手工传播也会很棘手。为使事情易于处理, .next_method() 调用始终只返回上行调用的返回值,如果您想象 AT_END 参数那样将这些返回值收集到列表中,那么将需要附加并操作您认为正确的值。但是,在最常见的“用例”中要执行一系列相关的初始化;在这种情况下,返回值往往是不相关的。

关于线程安全的说明

这儿有必要插入一点说明,免得读者遇到问题。由于传播采用有状态方式跟踪调用了哪些(依次不太特定的)规则,所以分派器不是线程安全的。如果您希望在多线程中使用分派器,那么您应该为每个线程“克隆”分派器。这样做不是很耗内存和 CPU 资源,因此克隆分派器并不会付出很大代价。例如,假定可以通过线程调用某个函数;您可以写成:

清单 9. 针对线程安全的克隆

def threadable_dispatch(dispatcher, other, arguments)
  dispatcher = dispatcher.clone()
  #...do setup activities...
  dispatcher(some, rule, pattern)
  #...do other stuff...

如果在 threadable_dispatch() 中没有生成新线程,那就一切正常了。

您花一点时间就可以理解多分派的思想了,如果您精通面向对象编程,那就更不在话下了。但是应用它一段时间后,您可能会发现多分派从一开始就泛化并增强了 OOP 胜过过程编程的优势。

上一页  3 4 5 6 7 8 

Tags:Python 多元 泛化

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