元类是什么
由于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继承关系去父类中找--->报错