1. 什么是元编程(Metaprogramming)
元编程是 编写操作代码的代码,即程序在运行时可以:
- 动态修改自身结构(如类、函数)。
- 生成或分析代码。
- 实现高度灵活的抽象(如自动生成代码逻辑)。
2. Python 中的元编程实现
- 装饰器:动态修改函数/类的行为(如添加日志、权限检查)。
- 元类(Metaclass):控制类的创建过程(如自动添加属性、方法)。
- 反射(Reflection):通过
getattr()
,setattr()
等函数在运行时检查或修改对象。 - 动态代码执行:使用
eval()
,exec()
执行字符串代码。 - 描述符(Descriptor):通过
__get__
,__set__
控制属性访问。
例子1:装饰器实现元编程
def log_time(func):def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)print(f"{func.__name__} 耗时 {time.time() - start} 秒")return resultreturn wrapper@log_time # 动态为函数添加计时功能,不修改原函数代码
def heavy_calculation():time.sleep(2)heavy_calculation() # 输出:heavy_calculation 耗时 2.0001 秒
例子2:元类控制类创建
class Meta(type):def __new__(cls, name, bases, attrs):# 动态为所有类添加一个author属性attrs['author'] = "Anonymous"return super().__new__(cls, name, bases, attrs)class MyClass(metaclass=Meta):passprint(MyClass.author) # 输出:Anonymous → 元类自动注入属性
3. 元编程的核心思想
- 代码即数据:将代码视为可操作的对象(如函数、类可以被传递、修改)。
- 抽象层次提升:通过自动化代码生成或修改,减少重复代码。
- 运行时动态性:程序的行为在运行时才确定(而非写死在源码中)。
闭包、作用域与元编程的关系
- 装饰器的实现依赖闭包:装饰器通过闭包捕获原函数,并返回增强后的新函数,这是元编程的典型应用。
- 元编程的底层基础是作用域规则:例如,元类通过操作类的命名空间(
__dict__
)动态修改类属性,而闭包则利用作用域链实现变量捕获。
总结
- 元编程:通过操作代码本身提升灵活性和抽象能力,Python 的装饰器、元类、反射等特性均属于元编程范畴。