python是一门动态的语言,动态语言的精髓在于可以在运行期间,创建类,通过类创建对象,进而通过对象调用方法和属性。元类即是创建类的类,我们可以通过用type的来创建类,故而type就是元类。但是为什么要有元类呢,它有什么作用吗,其实元类的作用就是控制一个类的初始化过程。我们在python3中可以通过元类来控制一个类的初始化过程,具体的初始化步骤,我会用代码进行演示。
1 使用type创建类
# coding=utf-8 def say(self): return "hello world" class baseClass: def answer(self): return "hello" if __name__ == "__main__": #创建类的过程type的第一个参数表示类的名称,第二个是元组表示继承类,第三个参数是字典表示的是属性和方法 son = type("son", (baseClass,), {"age": 10, "say": say}) sn = son() print(sn.say())
2 用元类的作用
其实上面的代码你看不出来他的任何作用,这是因为,在python3中,使用元类的目标都是控制创建对象之前的一些检查,如果不符合预期则直接抱出异常,这种方式更加的优雅,并且python天生就支持这种检查,具体代码如下,对于创建一个类如果你规定类中必须有某个函数如果某个函数不存在则不予创建,这种需求的话,则使用如下方式更加优雅。
# 定义元类为CheckParamer并且继承type表示自己是一个元类 class CheckParamer(type): # 控制Father类实例化的过程,可以添加自定义逻辑对father的一些属性和方法做校验,如果这些参数都符合条件则创建对象,不符合则抱出异常 def __new__(cls, *args, **kwargs): #检查father类中是否有say函数 if "say" not in args[2]: raise ValueError("say must be contain") return super().__new__(cls, *args, **kwargs) # 将Father类的元类设置为CheckParamer class Father(metaclass=CheckParamer): def __init__(self, name): self.name = name def say(self): return "123" def __str__(self): return "Father"