python 元类

Posted zero1230

tags:

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

元类

元类是类的类,是类的模板

元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为

元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)

type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象

手动模拟class创建类的过程):将创建类的步骤拆分开,手动去创建

#创建类主要分为三部分

  1 类名

  2 类的父类

  3 类体


#类名
class_name=‘Chinese‘
#类的父类
class_bases=(object,)
#类体
class_body="""
country=‘China‘
def __init__(self,name,age):
    self.name=name
    self.age=age
def talk(self):
    print(‘%s is talking‘ %self.name)
"""
步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体的代码
(exec产生名称空间的过程与真正的class过程类似,只是后者会将__开头的属性变形),生成类的局部名称空间,即填充字典class_dic={}
exec(class_body,globals(),class_dic)
print(class_dic)
步骤二:调用元类type(也可以自定义)来产生类ChinenseFoo=type(class_name,class_bases,class_dic) #实例化type得到对象Foo
print(Foo)
print(type(Foo))
print(isinstance(Foo,type))
‘‘‘
<class ‘__main__.Chinese‘>
<class ‘type‘>
True
‘‘‘

type 接收三个参数:

  • 第 1 个参数是字符串 ‘Foo’,表示类名
  • 第 2 个参数是元组 (object, ),表示所有的父类
  • 第 3 个参数是字典,这里是一个空字典,表示没有定义属性和方法

自定义元类控制类的行为

一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用户也可以通过继承type来自定义元类
class Mymeta(type): #继承默认元类的一堆属性
    def __init__(self,class_name,class_bases,class_dic):
        if not class_name.istitle():
            raise TypeError(‘类名首字母必须大写‘)

        super(Mymeta,self).__init__(class_name,class_bases,class_dic)

    def __call__(self, *args, **kwargs):
        #self=People
        print(self,args,kwargs) #<class ‘__main__.People‘> (‘egg‘, 18) {}

        #1、实例化People,产生空对象obj
        obj=object.__new__(self)


        #2、调用People下的函数__init__,初始化obj
        self.__init__(obj,*args,**kwargs)


        #3、返回初始化好了的obj
        return obj

class People(object,metaclass=Mymeta):
    country=‘China‘

    def __init__(self,name,age):
        self.name=name
        self.age=age

    def talk(self):
        print(‘%s is talking‘ %self.name)

obj=People(‘egg‘,18)
print(obj.__dict__) #{‘name‘: ‘egg‘, ‘age‘: 18}



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

深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass)

Python基础 type元类

参数化类和元类有啥区别(请使用 Python 中的代码示例)?

具有自定义元类行为的 Python 元类