Python打卡训练营day29-类的装饰器
知识点回顾
- 类的装饰器
- 装饰器思想的进一步理解:外部修改、动态
- 类方法的定义:内部定义和外部定义
相比函数装饰器只能增强单个函数的行为。类装饰器可以 动态为类添加新方法
为圆类添加体积方法
import math def add_volume(cls):def volume(self):return 4/3 * self.radius**3 * math.picls.volume = volume # 动态添加类return cls@add_volume
class Circle: # 定义一个类def __init__(self, radius=1): # 传入半径self.radius = radius # self.radius 是实例属性(可修改属性名,需同步改方法中的用)def calculate_area(self): # 定义周长方法return math.pi * self.radius ** 2 # math.pi 是固定常量,self.radius 是实例属性def calculate_circumference(self): # 定义面积方法return 2 * math.pi * self.radius
cir1 = Circle(1)
print(cir1.volume())
4.1887902047863905
为类的方法添加日志
def log_all_methods(cls):for name, method in cls.__dict__.items():if callable(method):# 立即绑定当前的 name 值def logged_method(method, name=name): # 关键:name=name 立即捕获当前值def wrapper(*args, **kwargs):print(f"[LOG] 调用方法: {name}") # 使用闭包外层的 namereturn method(*args, **kwargs)return wrappersetattr(cls, name, logged_method(method))return clsCircle = log_all_methods(Circle)cir2 = Circle(2)
print(cir2.calculate_circumference())
[LOG] 调用方法: __init__
[LOG] 调用方法: calculate_circumference
12.566370614359172
通过装饰器为类添加父类
class LogMixin: # 定义一个混入类(提供日志功能)def log(self, message):print(f"[LOG] {message}")def add_mixin(cls):# 动态添加 LogMixin 为父类return type(cls.__name__, (cls, LogMixin), {})@add_mixin # 添加 LogMixin 为父类
class MyClass:passobj = MyClass()
obj.log("测试日志") # 输出 "[LOG] 测试日志"