首页 > Python基础教程 >
-
深刻理解Python中的元类(metaclass)
译注:这是一篇在Stack overflow上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程。于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去。而e-satis同学本人在Stack Overflow中的声望积分也高达64271分。以下就是这篇精彩的回复(提示:非常长)
类也是对象
在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:
1
2
3
4
5
|
>>> class ObjectCreator(object): … pass … >>> my_object = ObjectCreator() >>> print my_object |
<__main__.objectcreator object="" at="" 0x8974f2c="">
但是,Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。下面的代码段:
1
2
3
|
>>> class ObjectCreator(object): … pass … |
将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是乎你可以对它做如下的操作:
1) 你可以将它赋值给一个变量
2) 你可以拷贝它
3) 你可以为它增加属性
4) 你可以将它作为函数参数进行传递
下面是示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
>>> print ObjectCreator # 你可以打印一个类,因为它其实也是一个对象 >>> def echo (o): … print o … >>> echo (ObjectCreator) # 你可以将类做为参数传给函数 >>> print hasattr(ObjectCreator, 'new_attribute' ) Fasle >>> ObjectCreator.new_attribute = 'foo' # 你可以为类增加属性 >>> print hasattr(ObjectCreator, 'new_attribute' ) True >>> print ObjectCreator.new_attribute foo >>> ObjectCreatorMirror = ObjectCreator # 你可以将类赋值给一个变量 >>> print ObjectCreatorMirror() <__main__.objectcreator object= "" at= "" 0x8997b4c= "" > |
动态地创建类
因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用class关键字即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
>>> def choose_class(name): … if name == 'foo' : … class Foo(object): … pass … return Foo # 返回的是类,不是类的实例 … else : … class Bar(object): … pass … return Bar … >>> MyClass = choose_class( 'foo' ) >>> print MyClass # 函数返回的是类,不是类的实例>>> print MyClass() # 你可以通过这个类创建类实例,也就是对象 <__main__.foo object= "" at= "" 0x89c6d4c= "" > |