0903——元类

Posted sheppard

tags:

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

元类是什么

由于python中一切皆对象,所有类实际上也是一个个对象。

而产生类的类,就叫元类,也就是说元类的实例化对象就是类

type是内置的一个元类,所有类(包括type本身)都是由type实例化产生。而继承type的自创类,也叫元类

如何找元类

print(type(dict))  #type
print(type(list))   #type
print(type(str))    #type
print(type(object))     #type
print(type(type))   #type

class的底层原理分析

class的底层原理其实就是传几个参数让type实例化出一个对象,这个对象就是类。

#通过type来直接产生类,不用class关键字了
l=
exec('''
school='oldboy'
def __init__(self,name):
    self.name=name
def score(self):
    print('分数是100')
''',,l)
def __init__(self,name):
    self.name=name

Person=type('Person',(object,),l)

print(Person.__bases__)

通过自定义元类来控制类的产生

#自定义元类;来控制类的产生:可以控制类名,可以控制类的继承父类,控制类的名称空间

# type
#自定义元类必须继承type,写一个类继承type     这种类都叫元类

class Mymeta(type):
    # def __init__(self,*args,**kwargs):
    def __init__(self,name,bases,dic):
        # self 就是Person类
        # print(name)
        # print(bases)
        # print(dic)
        #练习一:加限制 控制类名必须以sb开头
        # if not name.startswith('sb'):
        #     raise Exception('类名没有以sb开头')
        #练习二:类必须加注释
        print(self.__dict__['__doc__'])
#metaclass=Mymeta  指定这个类生成的时候,用自己写的Mymeta这个元类
class Person(object,metaclass=Mymeta):
    '''
    注释
    '''
    school='oldboy'
    def __init__(self,name):
        self.name=name
    def score(self):
        print('分数是100')

通过自定义元类来控制类的调用过程

#__call__
#控制类的调用过程,实际上在控制:对象的产生
class Mymeta(type):
    def __call__(self, *args, **kwargs):
        # print('xxx')

        return 1

class Person(object,metaclass=Mymeta):
    school='oldboy'
    def __init__(self,name):
        self.name=name
    def score(self):
        print('分数是100')

p=Person('nick')
print(p.name)

有了元类之后的属性查找顺序

#类的属性查找顺序:先从类本身中找--->mro继承关系去父类中找---->去自己定义的元类中找--->type中--->报错

#对象的属性查找顺序:先从对象自身找--->类中找--->mro继承关系去父类中找--->报错

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

0903——元类

1104课堂小结

096 元类

面向对象之元类

面向对象-元类

python 吐血总结面向对象元类