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

Python 中的元类编程

 2008-09-30 12:43:17 来源:WEB开发网   
核心提示: 元类的魔力是如此之大,以至于 99% 的用户曾有过的顾虑都是不必要的,Python 中的元类编程(3),如果您想知道是否需要它们,则可以不用它们(那些实际需要元类的人们确实清楚自己需要它们, type(obj) 返回对象 obj 的类型/类),作为类工厂的新 type 类,不需要解释原因)

元类的魔力是如此之大,以至于 99% 的用户曾有过的顾虑都是不必要的。如果您想知道是否需要它们,则可以不用它们(那些实际需要元类的人们确实清楚自己需要它们,不需要解释原因)。— Python 专家 Tim Peters

(类的)方法象普通函数一样可以返回对象。所以从这个意义上讲,类工厂可以是类,就象它们可以是函数一样容易,这是显然的。尤其是 Python 2.2+ 提供了一个称为 type 的特殊类,它正是这样的类工厂。当然,读者会认识到 type() 不象 Python 老版本的内置函数那样“野心勃勃”— 幸运的是,老版本的 type() 函数的行为是由 type 类维护的(换句话说, type(obj) 返回对象 obj 的类型/类)。作为类工厂的新 type 类,其工作方式与函数 new.classobj 一直所具有的方式相同:

清单 3. 作为类工厂元类的 type

>>> X = type('X',(),{'foo':lambda self:'foo'})
>>> X, X().foo()
(<class '__main__.X'>, 'foo')

但是因为 type 现在是(元)类,所以可以自由用它来创建子类:

清单 4. 作为类工厂的 type 后代

>>> class ChattyType(type):
...   def __new__(cls, name, bases, dct):
...     print "Allocating memory for class", name
...     return type.__new__(cls, name, bases, dct)
...   def __init__(cls, name, bases, dct):
...     print "Init'ing (configuring) class", name
...     super(ChattyType, cls).__init__(name, bases, dct)
...
>>> X = ChattyType('X',(),{'foo':lambda self:'foo'})
Allocating memory for class X
Init'ing (configuring) class X
>>> X, X().foo()
(<class '__main__.X'>, 'foo')

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

Tags:Python 编程

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