• 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继承关系去父类中找--->报错
    
    
  • 相关阅读:
    codeforces 540 C Ice Cave【BFS】
    UVa 140 Bandwidth【枚举排列】
    UVa 1600 Patrol Robot【BFS】
    UVa 1599 Ideal Path【BFS】
    HDU 4324 Triangle LOVE【拓扑排序】
    HDU 2647 Reward【拓扑排序】
    UVa 10305 Ordering Tasks【拓扑排序】
    codeforces 501 B Misha and Changing Handles 【map】
    codeforces 510 C Fox And Names【拓扑排序】
    落谷_2740/poj_1273/USACO_4.2/网络流
  • 原文地址:https://www.cnblogs.com/Sheppard/p/11453561.html
Copyright © 2020-2023  润新知