您可以使用元类对属性、方法及其值执行不同的准则。前面例子(使用 snake_case)的类似示例包括:
值的域限制
隐式转换自定义类的值(您可能希望向用户隐藏编写类的所有这些复杂方面)
执行不同的命名约定和样式准则(比如,“每种方法都应有一个文档字符串”)
向类添加新的属性
在类定义本身中定义所有这种逻辑时使用元类,主要原因就是为了避免在整个代码库中出现重复代码。
元类的实际使用
因为在子类中会继承元类,所以元类解决了代码冗余(不要重复自己 — DRY)这一实际问题。 通常情况下,在生成类对象的同时,通过执行额外操作或添加额外代码,元类也可以帮助提取有关类创建的复杂逻辑。元类的一些实际用例包括:
抽象基类
类的注册
在库和框架中创建 API
我们来具体看一下每个示例。
抽象基类
抽象基类是只能被继承而不会被实例化的类。Python 具有以下内容:
我们来创建一个从 Vehicle 类继承的 Truck 类:
请注意,我们没有实现抽象方法。我们来看下如果尝试实例化 Truck 类的对象会发生什么情况:
可以通过在 Truck 类中定义两种抽象方法来修复这个问题:
类的注册
为理解这一点,我们以某个服务器上的多个文件处理程序为例。想法就是能够根据文件格式快速找到正确的处理程序类。我们将创建处理程序字典,让 CustomMetaclass 注册在代码中遇到的不同处理程序:
现在,根据文件格式,我们很容易就知道要使用哪个处理程序类。一般来说,无论何时需要维护存储类特征的某种数据结构,都可以使用元类。
网友评论