Python提升——元类是怎么创建一个类的?

如果你看过比较优秀的 Python 开源框架,肯定见到过元类的身影。例如,在一个类中定义了类属性 __metaclass__,这就说明这个类使用了元类来创建。

那元类的实现原理究竟是怎样的?使用元类能帮我们在开发中解决什么样的问题?

这篇文章,我们就来看一下 Python 元类的来龙去脉。

什么是元类?

我们都知道,定义一个类,然后调用它的构造方法,就可以初始化出一个实例出来,就像下面这样:


  1. class Person(object)  
  2.     def __init__(name):  
  3.         self.name = name  
  4. p = Person('zhangsan') 

那你有没有想过,我们平时定义的类,它是如何创建出来的?

别着急,我们先来看一个例子:


  1. >>> a = 1               # 创建a的类是int a是int的实例  
  2. >>> a.__class__  
  3. <type 'int'>  
  4. >>> b = 'abc'           # 创建b的类是str b是str的实例  
  5. >>> b.__class__  
  6. <type 'str'>  
  7. >>> def c():            # 创建c的类是function 方法c是function的实例  
  8. …     pass  
  9. >>> c.__class__  
  10. <type 'function'>  
  11. >>> class D(object):    # 创建d的类是D d是D的实例  
  12. …     pass  
  13. >>> d.__class__  
  14. <class '__main__.D'> 

在这个例子中,我们定义了 int、str、function、class,然后分别调用了它们的__class__ 方法,这个 __class__ 方法可以返回实例是如何创建出来的。

从方法返回的结果我们可以看到:

  •  创建整数 a 的类是 int,也就是说 a 是 int 的一个实例
  •  创建字符串 b 的类是 str,也就是说 b 是 str 的一个实例
  •  创建函数 c 的类是 function,也就是说 c 是 function 的一个实例
  •  创建实例 d 的类是 class,也就是说 d 是 class 的一个实例

除了这些之外,我们在开发中使用到的例如 list、dict 也类似,你可以测试观察一下结果。

现在我们已经得知,创建这些实例的类是 int、str、function、class,那进一步思考一下,这些类又是怎么创建出来的呢?

同样地,我们也调用这些类的 __class__ 方法,观察结果:


  1. >>> a = 1 
  2. >>> a.__class__.__class__  
  3. <type 'type'>  
  4. >>>  
  5. >>> b = 'abc'  
  6. >>> b.__class__.__class__  
  7. <type 'type'>  
  8. >>>  
  9. >>> def c():  
  10. …     pass  
  11. >>> c.__class__.__class__ 
  12. <type 'type'>  
  13. >>>  
  14. >>> class D(object):  
  15. …     pass  
  16. >>> d = D()  
  17. >>> d.__class__.__class__  
  18. <type 'type'> 

从结果我们可以看到,创建这些类的类,都是 type,所以 type 就是创建所有类的「元类」。也就是说,元类的作用就是用来创建类的。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章