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)