深刻理解Python中的元类(metaclass)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深刻理解Python中的元类(metaclass)相关的知识,希望对你有一定的参考价值。
<>本文转自博客在线,只供自己学习保存,任何转载和使用,责任自负,原地址:http://blog.jobbole.com/21351/
译注:这是一篇在Stack overflow上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程。于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去。而e-satis同学本人在Stack Overflow中的声望积分也高达64271分。以下就是这篇精彩的回复(提示:非常长)
类也是对象
在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:
1
2
3
4
5
6
|
>>>classObjectCreator(object):
… pass
…
>>>my_object=ObjectCreator()
>>>printmy_object
<__main__.ObjectCreator objectat0x8974f2c>
|
但是,Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。下面的代码段:
1
2
3
|
>>>classObjectCreator(object):
… pass
…
|
将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是乎你可以对它做如下的操作:
1) 你可以将它赋值给一个变量
2) 你可以拷贝它
3) 你可以为它增加属性
4) 你可以将它作为函数参数进行传递
下面是示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>>>printObjectCreator # 你可以打印一个类,因为它其实也是一个对象
<class‘__main__.ObjectCreator‘>
>>>defecho(o):
… printo
…
>>>echo(ObjectCreator) # 你可以将类做为参数传给函数
<class‘__main__.ObjectCreator‘>
>>>printhasattr(ObjectCreator,‘new_attribute‘)
Fasle
>>>ObjectCreator.new_attribute=‘foo‘# 你可以为类增加属性
>>>printhasattr(ObjectCreator,‘new_attribute‘)
True |
以上是关于深刻理解Python中的元类(metaclass)的主要内容,如果未能解决你的问题,请参考以下文章