本文主要介绍Python的MetaClass的用法。
MetaClass也是一个class,这个class继承自type,它用于生产新的class对象。定义class的时候,就会执行到MetaClass的__new__()代码。
从这里出发,我们需要一个新的class的时候,就可以使用MetaClass定义它的行为。本文介绍MetaClass的三种用法:
- 定义新的class的时候,执行一些检查操作
- 定义新的class的时候,将新class进行注册动作
- 定义新的class的时候,自动修改class的属性
MetaClass可以读取和修改class的属性。
Python
|
|
关于__new__方法讲解文章: 一文详解Python中__new__方法的作用
用MetaClass验证
定义一个新的class相当于调用type创建一个新的class对象,所以覆盖__new__()方法可以实现一些验证的动作。
下面的代码定义了一个多边形的MetaClass,在定义新的class的时候,验证边数是否小于3,如果小于3,这不科学。
Python
|
|
这一段有问题,会触发sides=None的报错,应该是执行顺序问题
修改class的属性
假设我们想要实现一个Python对象到数据库字段的对应(也就是ORM),我们可以使用前面博客提到的Descriptor,如下。
Python
|
|
但是这里存在的问题是,first_name已经写了一次了,还要在创建Field的时候再写一次,不是有些多余吗?Field应该自动根据引用它的变量名自动命名。这可以通过MetaClass来做到。
Python
|
|
综上,MetaClass是非常实用的,可以帮我们减少很多需要重复复制粘贴的代码。
python learning website
Python new
Python type Class
Python Metaclass
Python Metaclass Example