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

Python 中的元类编程(3)

 2008-09-30 12:42:40 来源:WEB开发网   
核心提示: 换句话说,只有当想在派生类上运行代码,Python 中的元类编程(3)(4),又不想让用户注意到时,才应该使用自定义元类,但是也有一些缺馅:它要求重复输入类名称;可读性不够理想,因为类定义和类初始化是分开的 —— 长的类定义可能会漏掉最后一行;并且它会认为首先定义一

换句话说,只有当想在派生类上运行代码,又不想让用户注意到时,才应该使用自定义元类。如果不属于这种情形,那就跳过元类,使您(和您的用户)的生活更加惬意。

classinitializer 装饰器

本文以下部分可能会被谴责为聪明过度。但是聪明不应该加重用户的负担,只应该加重我们作者的负担。读者可以做一些与我们假设的理想类装饰器类似的事情,但是要避免在元类方法中出现的继承及元类冲突问题。我们后面给出的 “不可思议的” 装饰器通常情况下只能增强直观的(但稍微有些难看的)强制方法,并且跟下面的例子在 “精神上相当”:

清单 4. 强制方法

def Enhance(cls, **kw):
  for k, v in kw.iteritems():
    setattr(cls, k, v)
class ClassToBeInitialized(object):
  pass
Enhance(ClassToBeInitialized, a=1, b=2)

上面的强制增强器并不是很坏。但是也有一些缺馅:它要求重复输入类名称;可读性不够理想,因为类定义和类初始化是分开的 —— 长的类定义可能会漏掉最后一行;并且它会认为首先定义一些内容然后又立即更改是不对的。

classinitializer 装饰器提供了一个说明性解决方案。装饰器将 Enhance(cls,**kw) 转换为一个能够用于类定义中的方法:

清单 5. 基本操作中神奇的装饰器

>>> @classinitializer # add magic to Enhance
... def Enhance(cls, **kw):
...   for k, v in kw.iteritems():
...     setattr(cls, k, v)
>>> class ClassToBeInitialized(object):
...   Enhance(a=1, b=2)
>>> ClassToBeInitialized.a
1
>>> ClassToBeInitialized.b
2

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

Tags:Python 编程

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