2019.9.3学习整理

2019.9.3学习整理

什么是元类

  • 在python中一切皆对象,那么我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类,即元类可以简称为类的类
  • Person类也是个对象,那他一定是由一个类实例化得到,这个类,就叫元类
  • type是内置的一个元类,所有的类都是由type实例化得到

为什么用元类

元类是负责产生类的,所以我们学习元类或者自定义元类的目的:是为了控制类的产生过程,还可以控制对象的产生过程

class 关键字底层实现原理

class 底层就是调用type来实例化产生类(对象)

#class 类名   会把类构造出来
#实际上是:元类实例化产生类  这个对象
#类实例化产生对象,一定是:   类名()
#Person  类是由type实例化产生,传一堆参数
#type()  调用类的__init__方法
# type()
#type(object_or_name, bases, dict)
# object_or_name:类的名字,是个字符串
#bases:是它的所有父类,基类
#dict:名称空间,是一个字典


l={}
exec ('''
school='oldboy'
def __init__(self):
    self.name=name
def score(self):
    print('100')
''',{},l)

Person=type('Person',(object,),l)
print(Person.__dict__)
print(Person.__bases__)

通过元类控制类的产生

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

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

class Mymeta(type):

    def __init__(self,name,bases,dic):
        print(self.__dict__['__doc__'])
        doc=self.__dict__['__doc__']
        if not doc.strip():
            raise Exception('你的类没有加注释')



# metaclass=Mymeta  指定这个类生成的时候,用自己写的Mymeta这个元类
class sb_Person(object, metaclass=Mymeta):
    '''
    注释
    '''
    school = 'oldboy'

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

    def score(self):
        print('分数是100')

通过元类控制类的调用过程

控制类的调用过程,实际上在控制:对象的产生

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)
原文地址:https://www.cnblogs.com/zhangmingyong/p/11455183.html