Python用多元法泛化多态性
2007-03-29 12:18:17 来源:WEB开发网核心提示:面向对象编程的多功能性有许多是通过多态性获得的,多态性是指:倘若有合适的上下文,Python用多元法泛化多态性,不同类型的对象可以用类似的方式进行工作,但大多数 OOP 编程是单分派(single dispatch)的;也就是说,我们真正关心的是在上下文中选择要执行的正确代码路径;老式的过程代码可以做出同样的决定,OO
面向对象编程的多功能性有许多是通过多态性获得的,多态性是指:倘若有合适的上下文,不同类型的对象可以用类似的方式进行工作。但大多数 OOP 编程是单分派(single dispatch)的;也就是说,仅有一个指定的对象确定采用哪一个代码路径。从概念上来说,较通用的技术是允许函数/方法的所有参数确定其专门化。本文介绍了用 Python 进行多分派(multiple dispatch)的实现,并演示了用该实现生成更佳程序的示例。
什么是多态性?
使用 Python 或其它面向对象编程语言的大多数程序员在使用多态性时都采用了一种较为实用和具体的方式。也许多态性最常见的应用是在创建符合公共协议的一系列对象方面。在 Python 中,这通常只是特别的多态性问题;在其它语言中,较为常见的是声明形式接口和/或这些系列共享一个公共祖先。
例如,有许多函数都是对“类文件”对象进行操作,其中只是通过支持类似 .read() 、 .readlines() 也许还有 .seek() 这样的几个方法来定义类文件。类似 read_app_data() 这样的函数可能带有参数 src ,当我们调用该函数时,我们可能决定将该参数传递给本地文件、 urllib 对象、 cStringIO 对象还是一些让该函数调用 src.read() 的定制对象。从每个对象在 read_app_data() 中如何运行这一角度来看,每个对象类型是可交换的。
让我们回头想想这里面真正发生了什么。事实上,我们真正关心的是在上下文中选择要执行的正确代码路径;老式的过程代码可以做出同样的决定,OOP 只不过使代码雅致了些。例如,一个过程(伪)代码片断可能为如下所示:
清单 1. 对象类型上代码路径的过程选择
...bind 'src' in some manner...
if <<src is a file object>>:
read_from_file(src)
elif <<src is a urllib object>>:
read_from_url(src)
elif <<src is a stringio object>>:
read_from_stringio(src)
...etc...
更多精彩
赞助商链接