Python成为专业人士笔记-MetaClass元类概念

“专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!

介绍

元类允许通过替换类默认所使用的type元类,来深入修改Python类的行为(如类的定义、实例化、访问等方式)

基本元类

什么是元类呢?现在让我们假设它只是class的父类的一个花哨的名称,继续讲述:

1、在Python中,所有内容都是对象,所以所有内容都有一个类
2、而定义和描述一个类的类称为元类
3、默认的元类都是type,到目前为止,它是最常见的元类;当然,你可以自定义,见后文

type是所有类的元类,如下代码会产生一个新的基于type的类:

        Dummy = type('OtherDummy', (), dict(x=1))

print(Dummy.__class__)
print(Dummy().__class__.__class__)

#输出:
<class 'type'>
<class 'type'> 
      

因此,所有的类包括object都是来源于type,它是所有类的元类,可以通过类的继承来创建自定义元类:

        class mytype(type):

    def __init__(cls, name, bases, dict):
        # 调用type元类的构造函数
        type.__init__(cls, name, bases, dict)

        #  执行自定义初始化 
        cls.__custom_attribute__ = 2


MyDummy = mytype('MyDummy', (), dict(x=2))

print(MyDummy.__class__)
print(MyDummy().__class__.__class__ )
print(MyDummy.__custom_attribute__) # 输出2 这里是自定义初始化后的输出

#输出:
<class '__main__.mytype'>
<class '__main__.mytype'> 
2
      

metaclass关键字

理论上,任何类的元类都可以单独指定,使用metaclass关键字即可:

        class MyClass(metaclass=SomeMetaclass):
    pass
      

在Python中,所有的内容都是对象:整数、字符串、列表,甚至函数和类本身都是对象。每个对象都是一个类的一个实例。要检查对象x的所属的类,可以调用type(x),因此,看看如下代码:

        print(type(5))  #<class 'int'>
print(type([1, 2, 3]))  #<class 'list'>

class C(object):
    pass

print(type(C)) #<class 'type'>  注意,前面讲过,所有的类都继承自元类type
      

那么,在Python中已经有一个元类:type。我们还能再创造一个吗 ?

        class SimplestMetaclass(type):
    pass

class MyClass(metaclass=SimplestMetaclass):
    __metaclass__= SimplestMetaclass  #注意:只在Python2X中有用,Python3中已废弃,只需在类的参数中 metaclass=SimplestMetaclass 即可


print(type(MyClass))

# <class 'main.SimplestMetaclass'> 可以看到,它的元类已变为 SimplestMetaclass 了
      

但是为什么要了解元类呢?好吧,Python本身是是“可编程”的,如果您正在进行诸如元编程之类的高级工作,或者如果您想控制类的初始化方式,了解元类的概念是很重要的

以上代码在python3云环境下已调试通过,今天的分享就到这里,禁止转载;

猜你喜欢

转载自blog.csdn.net/oSuiYing12/article/details/106233140