一、简述:基于“一切皆对象”的原则,类也是由某种其之上的创造者实例出来的产物,这样的类的创造者称为元类。
二、类产生的过程:对象是由调用类,即实例化类产生的,那么,类就是由调用元类,即实例化元类而产生的。
三、对象产生的完整过程:元类===》实例化===》类===》实例化===》对象。
四、内置元类type:所有用class关键字自定义出来的类以及所有内置的类都是元类type实例化的产物,都是调用type产生的,即class关键字自定义类的过程就是调用元类type的过程。
五、class关键字自定义类的实际步骤:
1、先拿到类的三要素:
①类名:class_name = 'Human'
②类的基类:class_bases = (object,)
③执行类体的代码拿到类的名称空间:通过exec (class_body = '''类体代码''' , {全局变量} , class_dict = {} ),获得类的名称空间class_dict。
2、调用元类生成类:Human = type(class_name,class_bases,class_dict)。
六、自定义元类Mymeta来定制类的产生:调用Mymeta的三个步骤。
1、先调用Mymeta的__new__功能,返回值即空类Human。
2、然后调用Mymeta的__init__功能初始化空类Human。
3、因为Mymeta的父类,即元类type有__call__功能,所以Mymeta可以被调用并返回__call__功能的返回值,该返回值就是Mymeta创造的类Human。
class Mymeta(type): # 只有继承了元类type 的类,才算元类 def __new__(cls, *args, **kwargs): # 可以添加自定义代码 return super().__new__(cls, *args, **kwargs) def __init__(cls,x,y,z): # 可以添加自定义代码 super().__init__(x,y,z) def __call__(self, *args, **kwargs): human_obj = self.__new__(self) self.__init__(human_obj, *args, **kwargs) # 可以添加自定义代码 return human_obj class Human(metaclass=Mymeta): def __new__(cls, *args, **kwargs): # 可以添加自定义代码 return super().__new__(cls) def __init__(self, name, age): self.name = name self.age = age def show_name(self): print(self.name) obj = Human('tom', '18')
七、属性查找顺序
1、根据对象查找:对象===》类===》父类
2、根据类查找:类===》父类===》元类