深度思维者

永远年轻,永远热泪盈眶

python之metaclass(元类)详解

一.认识

首先--类和大多数编程语言一样,是一组用来描述如何生成一个对象的代码段;
其次--类同样也是一种对象,只要你使用关键字class,Python解释器在执行的时候就会在内存中创建一个对象,名字是ObjectCreator。这个对象自身拥有创建对象的能力(类实··例),这就是为什么它是一个类的原因。但是它的本质仍然是一个对象。

  •       1)可以将它赋值给一个变量;
          2)可以拷贝它
          3)可以为它增加属性
          4)可以将它作为函数参数进行传递
    

二. 顾名思义--"最原始的类,一切类的起源!"

- 概念: 元类就是用来创建类的“东西”,元类就是用来创建这些类(对象)的;元类就是类的类。
- 重点:函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类。
- 理由:为什么type会全部采用小写形式而不是Type,是为了和str保持一致性,str是用来创建字符串对象的类,而int是用来创建整数对象的类。type就是创建类对象的类。

总结:元类是创建类对象的东西,可以把元类称为“类工厂"。



**三 . 到底有什么用?**
  • 应用 :自定义元类

  • 主要目的:

    • 为了当创建类使能够自动地改变类。
    • 通常会为API做这样的事情,希望可以创建符合当前上下文的类。
  • 就元类本身而言,其实很简单:
    1) 拦截类的创建
    2) 修改类
    3) 返回修改之后的类



**四.为什么要用metaclass类而不是函数?**
1) 意图会更加清晰。当你读到UpperAttrMetaclass(type)时,你知道接下来要发生什么。

2) 你可以使用OOP编程。元类可以从元类中继承而来,改写父类的方法。元类甚至还可以使用元类。

3) 你可以把代码组织的更好。当你使用元类的时候肯定不会是像我上面举的这种简单场景,通常都是针对比较复杂的问题。将多个方法归总到一个类中会很有帮助,也会使得代码更容易阅读。

4) 你可以使用 _new__, __init__以及__call__这样的特殊方法。它们能帮你处理不同的任务。就算通常你可以把所有的东西都在
	__new__里处理掉,有些人还是觉得用__init__更舒服些。

5) 哇哦,这东西的名字是metaclass,肯定非善类,我要小心!


**五.为什么要使用元类?**

“元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。”
                      —— Python界的领袖 Tim Peters

  • 还有原因:元类的主要用途是创建API。一个典型的例子是Django ORM。
posted @ 2018-04-03 23:11  failymao  阅读(367)  评论(0编辑  收藏  举报