Python 中的元类编程
2008-09-30 12:43:17 来源:WEB开发网包 gnosis.xml.validity 不知道 DTD 和内部子集。那些概念和能力完全由元类 DTDGenerator 引入进来,对 gnosis.xml.validity 或 simple_diss.py 不做 任何更改。 DTDGenerator 不将自身的 .__str__() 方法替换进它产生的类 — 您仍然可以打印简单的 XML 片段 — 但元类可以方便地修改这种富有“魔力”的方法。
元带来的便利
为了使用元类以及一些可以在面向方面的编程中所使用的样本元类,包 gnosis.magic 包含几个实用程序。其中最重要的实用程序是 import_with_metaclass() 。在上例中所用到的这个函数使您能导入第三方的模块,但您要用定制元类而不是用 type 来创建所有模块类。无论您想对第三方模块赋予什么样的新能力,您都可以在创建的元类内定义该能力(或者从其它地方一起获得)。 gnosis.magic 包含一些可插入的序列化元类;其它一些包可能包含跟踪能力、对象持久性、异常日志记录或其它能力。
import_with_metclass() 函数展示了元类编程的几个性质:
清单 13. [gnosis.magic] 的 import_with_metaclass()
def import_with_metaclass(modname, metaklass):
"Module importer substituting custom metaclass"
class Meta(object): __metaclass__ = metaklass
dct = {'__module__':modname}
mod = __import__(modname)
for key, val in mod.__dict__.items():
if inspect.isclass(val):
setattr(mod, key, type(key,(val,Meta),dct))
return mod
在这个函数中值得注意的样式是,用指定的元类生成普通的类 Meta 。但是,一旦将 Meta 作为祖先添加之后,也用定制元类来生成它的后代。原则上,象 Meta 这样的类 既可以带有元类生成器(metaclass producer) 也可以带有一组可继承的方法 — Meta 类的这两个方面是无关的。
更多精彩
赞助商链接