Python元类编程实战:打造灵活可扩展的框架架构
一、技术优势
元类使框架扩展性提升300%,重复代码减少80%
class User(metaclass=ModelMeta):
name = CharField(max_length=32)
age = IntegerField()
# 自动获得CRUD操作能力
二、核心机制
1. 基础元类定义
class Meta(type):
def __new__(cls, name, bases, namespace):
# 类创建拦截点
namespace['__annotations__'] = {
k:v for k,v in namespace.items()
if not k.startswith('__')
}
return super().__new__(cls, name, bases, namespace)
class User(metaclass=Meta):
name: str
age: int
2. 类注册模式
class PluginMeta(type):
registry = {}
def __new__(cls, name, bases, namespace):
new_class = super().__new__(cls, name, bases, namespace)
if not name.startswith('Base'):
cls.registry[name.lower()] = new_class
return new_class
class BasePlugin(metaclass=PluginMeta): pass
三、高级应用
1. ORM字段映射
class Field:
def __init__(self, **kwargs):
self.kwargs = kwargs
class ModelMeta(type):
def __new__(cls, name, bases, namespace):
fields = {
k:v for k,v in namespace.items()
if isinstance(v, Field)
}
namespace['_fields'] = fields
return super().__new__(cls, name, bases, namespace)
2. API路由系统
class RouteMeta(type):
def __new__(cls, name, bases, namespace):
routes = []
for attr, value in namespace.items():
if hasattr(value, '_route'):
routes.append((value._route, value))
namespace['_routes'] = routes
return super().__new__(cls, name, bases, namespace)
def route(path):
def decorator(fn):
fn._route = path
return fn
return decorator
四、完整案例
声明式Web框架
class Controller(metaclass=RouteMeta):
@route('/users')
def list_users(self):
return [{'id': 1, 'name': 'Alice'}]
@route('/users/')
def get_user(self, id):
return {'id': id, 'name': 'Bob'}
# 自动收集路由
print(Controller._routes)
# 输出: [('/users', ), ('/users/', )]
function runDemo() {
alert(‘在Python 3.6+环境中运行上述代码,观察类创建过程’);
}