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

Python 中的元类编程(3)

 2008-09-30 12:42:40 来源:WEB开发网   
核心提示: 从实现上看,类初始化器是如何工作的就变得很清晰了:当在类中调用一个类初始化器时,Python 中的元类编程(3)(7),实际上定义了一个 _metaclass_ 钩子,它将会被这个类的元类(一般是 type) 调用,这个问题没有通用的解决方案;我们只是简单地记录,另一方面,元类将创建此类(

从实现上看,类初始化器是如何工作的就变得很清晰了:当在类中调用一个类初始化器时,实际上定义了一个 _metaclass_ 钩子,它将会被这个类的元类(一般是 type) 调用。元类将创建此类(作为一个新式类)并将其传递给类初始化器过程。

技巧和警告

当类初始化器(重新)定义 _metaclass_ 钩子时,它们不能很好地与显式(与隐式继承的相反)定义 _metaclass_ 钩子的类协作。如果 _metaclass_ 钩子在类初始化器之后 定义,它会静静地 覆盖类初始化器。

清单 8.表项目 index.html主页

>>> class C:
...   Enhance(a=1)
...   def __metaclass__(name, bases, dic):
...     cls = type(name, bases, dic)
...     print 'Enhance is silently ignored'
...     return cls
...
Enhance is silently ignored
>>> C.a
Traceback (most recent call last):
 ...
AttributeError: type object 'C' has no attribute 'a'

然而不幸的是,这个问题没有通用的解决方案;我们只是简单地记录。另一方面,如果在 _metaclass_ 钩子之后 调用类初始化器,将会得到异常:

清单 9. 本地元类出现错误

>>> class C:
...   def __metaclass__(name, bases, dic):
...     cls = type(name, bases, dic)
...     print 'calling explicit __metaclass__'
...     return cls
...   Enhance(a=1)
...
Traceback (most recent call last):
  ...
SyntaxError: Don't use two class initializers or
a class initializer together with a __metaclass__ hook

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

Tags:Python 编程

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