元类相关(type & metaclass)

Posted ugfly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了元类相关(type & metaclass)相关的知识,希望对你有一定的参考价值。

"""
metaclass作用:

 

1) 拦截类的创建

2) 修改类

3) 返回修改之后的类

"""


"""
为什么要用metaclass类而不是函数?

 

由于__metaclass__可以接受任何可调用的对象,那为何还要使用类呢,因为很显然使用类会更加复杂啊?这里有好几个原因:

1) 意图会更加清晰。当你读到UpperAttrMetaclass(type)时,你知道接下来要发生什么。

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

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

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

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

 

究竟为什么要使用元类?

现在回到我们的大主题上来,究竟是为什么你会去使用这样一种容易出错且晦涩的特性?好吧,一般来说,你根本就用不上它:

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

 

"""
知识点:
对象是类创建。创建对象时,类里面的__init__方法会自动执行。 对象()会执行类的__call__方法。
类是type创建。创建类时,type的__init__方法会自动执行。 类()会执行执行type的__call__方法。执行完__call__方法后,call方法不仅会调用类的__new__方法,还会调用类的__init__方法。

# 第0步: 执行type的 __init__ 方法【类是type的对象】
class Foo:
def __init__(self):
pass

def __call__(self, *args, **kwargs):
pass

# 第1步: 执行type的 __call__ 方法
# 1.1 调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
# 1.2 调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
obj = Foo()
# 第2步:执行Foo def __call__ 方法
obj()

 


"""

以上是关于元类相关(type & metaclass)的主要内容,如果未能解决你的问题,请参考以下文章

python——type()metaclass元类和精简ORM框架

metaclass元类解析

深入理解Python中的元类---metaclass

元类编程-- metaclass

python全栈开发基础补充metaclass(元类)

35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架