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

Python 中的元类编程(3)

 2008-09-30 12:42:40 来源:WEB开发网   
核心提示: 如果使用过 zope 界面,也许见过类初始化器的例子 (zope.interface.implements),Python 中的元类编程(3)(5),事实上,classinitializer 是使用一个从 Phillip J. Eby 开创的 zope.interface.advice 复

如果使用过 zope 界面,也许见过类初始化器的例子 (zope.interface.implements)。事实上,classinitializer 是使用一个从 Phillip J. Eby 开创的 zope.interface.advice 复制过来的技巧来实现的。此技巧使用 “ __metaclass__ ” 钩子,但是它不使用 自定义类。ClassToBeInitialized 保留了它原始的元类,即新式类的普通内置元类 type:

>>> type(ClassToBeInitialized)
<type 'type'>

原则上,此技巧也适用于老式类,并且应该容易编写一个实现来使老式类保持老的样式。然而,由于根据 Guido 所说的 “老式类在精神上是不受赞成的”,当前的实现将老式类转换为新式类:

清单 6. 升级为新式类

>>> class WasOldStyle:
...   Enhance(a=1, b=2)
>>> WasOldStyle.a, WasOldStyle.b
(1, 2)
>>> type(WasOldStyle)
<type 'type'>

classinitializer 装饰器的一个动机是要隐藏细节,使一般的人们能够用一种容易的方法实现他们自己的类初始化器,而不必知道类创建工作的细节和_metaclass_ 钩子的秘密。另一个动机是,即使对于 Python 奇才来说,每次编写新的类初始化器时都得重写管理 _metaclass_ 钩子的代码也是很不方便的。

最后应该注意,我们指出 Enhance 的已装饰版本当作类范围外的未装饰版本来运行已经足够漂亮了,假设传递给它一个显式类参数:

>>> Enhance(WasOldStyle, a=2)
>>> WasOldStyle.a
2

极度不可思议

下面是 classinitializer 的代码。使用装饰器不需要理解该代码:

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

Tags:Python 编程

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