一、简述:基于“一切皆对象”的原则,类也是由某种其之上的创造者实例出来的产物,这样的类的创造者称为元类。

二、类产生的过程:对象是由调用类,即实例化类产生的,那么,类就是由调用元类,即实例化元类而产生的。

三、对象产生的完整过程:元类===》实例化===》类===》实例化===》对象。

四、内置元类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、根据类查找:类===》父类===》元类

  

posted on 2020-02-02 10:01  焚音留香  阅读(164)  评论(0编辑  收藏  举报