WEB开发网
开发学院软件开发Python Python 中的元类编程(3) 阅读

Python 中的元类编程(3)

 2008-09-30 12:42:40 来源:WEB开发网   
核心提示: 表面上看本文除了大惊小怪之外,似乎毫无意义,Python 中的元类编程(3)(3),例如,为什么不直接把 XO 元类定义为 Enhance,我们甚至在试验代码中用了四年之后还很少在生产代码中使用它们, 您觉得对于类初始化这类简单的工作使用自定义元类是杀鸡用牛刀,然后就一切 OK 了呢, E

表面上看本文除了大惊小怪之外,似乎毫无意义。例如,为什么不直接把 XO 元类定义为 Enhance,然后就一切 OK 了呢。 Enhance.__init__() 可以为所讨论的特定用途添加所需的任何功能。可能看起来像这样:

清单 3. 将 XO 定义为 Enhance

class _XO_plus(gnosis.xml.objectify._XO_):
   __metaclass__ = Enhance
   features = [('XPath',XPath), ('addChild',addChild)]
gnosis.xml.objectify._XO_ = _XO_plus

不幸的是,当考虑到继承时,问题却没有这么简单。一旦为基类定义了一个自定义元类,所有派生类都将继承此元类,所以初始化代码将魔法般隐式地在所有派生类上运行。这在特定的情形中可能还不错(例如,假设必须将所有类都注册到您自己的框架中:使用元类可以确保不会忘记注册派生类),然而,在许多情况下则可能不喜欢这种行为,因为:

您相信显式比隐式更好。

派生类具有跟基类相同的动态类属性。为每个派生类再次设置这些属性是一种浪费,因为通过继承它们就会拥有这些属性。如果初始化代码很慢或者需要大量的计算,那么这一特性就显得特别重要。也许会在元类代码中添加一个检查,以查看是否在父类中设置了这些属性,但是这样会增加负担,并且不会控制所有的类。

自定义元类将会使类有些不可思议和不标准:您肯定不想增加元类冲突、“ __slots__ ” 问题、跟扩展类( Zope )斗争和其他复杂问题的几率。元类比很多人认识到的更加脆弱。我们甚至在试验代码中用了四年之后还很少在生产代码中使用它们。

您觉得对于类初始化这类简单的工作使用自定义元类是杀鸡用牛刀,所以想要使用一种更为简单的解决方案。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Python 编程

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