Python装饰器实战:给阳明心学代码加'强调边框'的三种方法
在Python开发中,装饰器就像给函数穿上一件外衣,既能保持原有功能不变,又能增添新的特性。今天我们就以阳明心学的代码为例,探索三种不同的装饰器实现方式,让哲学思考在代码中更加醒目。
1. 基础装饰器:简单实用的边框效果
让我们从一个最基础的装饰器开始,它能为任何函数调用添加上下边框,就像给重要内容加上着重号。这种装饰器特别适合快速标记关键函数,无需修改原有代码逻辑。
def simple_border(func):
def wrapper(*args, **kwargs):
print("=" * 40)
result = func(*args, **kwargs)
print("=" * 40)
return result
return wrapper
class MindPhilosophy:
def __init__(self, principle):
self.principle = principle
@simple_border
def explain(self):
print(f"阳明心学核心:{self.principle}")
if "知行合一" in self.principle:
print("(实践与认知的统一)")
使用时,装饰器会自动为explain方法添加边框:
philosophy = MindPhilosophy("知行合一")
philosophy.explain()
输出效果:
========================================
阳明心学核心:知行合一
(实践与认知的统一)
========================================
这种基础装饰器的优势在于:
- 实现简单,仅需嵌套一个wrapper函数
- 保持原函数参数传递的完整性
- 不影响原函数的返回值
2. 参数化装饰器:灵活定制边框样式
当基础装饰器无法满足多样化需求时,带参数的装饰器就派上用场了。我们可以让边框的字符、长度甚至颜色都能自定义。
def customizable_border(char="*", length=30, color_code=None):
def decorator(func):
def wrapper(*args, **kwargs):
border = char * length
if color_code:
print(f"\033[{color_code}m{border}\033[0m")
else:
print(border)
result = func(*args, **kwargs)
if color_code:
print(f"\033[{color_code}m{border}\033[0m")
else:
print(border)
return result
return wrapper
return decorator
class AdvancedPhilosophy:
def __init__(self, concept):
self.concept = concept
@customizable_border(char="♥", length=25, color_code="31")
def present(self):
print(f"深入理解:{self.concept}")
if "致良知" in self.concept:
print("(内在道德意识的觉醒)")
这个装饰器可以这样调用:
deep_thought = AdvancedPhilosophy("致良知")
deep_thought.present()
输出效果(红色心形边框):
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥
深入理解:致良知
(内在道德意识的觉醒)
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥
参数化装饰器的核心技巧:
- 外层函数接收装饰器参数
- 中层函数接收被装饰的函数
- 内层函数处理实际调用逻辑
提示:颜色代码需要终端支持ANSI转义序列,常见代码有31(红)、32(绿)、33(黄)等
3. 类装饰器:状态保持与复杂逻辑
当装饰器需要维护状态或实现更复杂的逻辑时,类装饰器是更好的选择。它通过__init__和__call__方法实现装饰功能。
class BorderDecorator:
def __init__(self, func, style="double"):
self.func = func
self.style = style
self.call_count = 0
def __call__(self, *args, **kwargs):
self.call_count += 1
border = self._get_border()
print(border)
print(f"调用次数: {self.call_count}")
result = self.func(*args, **kwargs)
print(border)
return result
def _get_border(self):
if self.style == "double":
return "═" * 35
elif self.style == "dashed":
return "-" * 35
else:
return "#" * 35
def class_decorator(style="double"):
def wrapper(func):
return BorderDecorator(func, style)
return wrapper
class PhilosophicalSystem:
def __init__(self, theory):
self.theory = theory
@class_decorator(style="double")
def demonstrate(self):
print(f"理论体系: {self.theory}")
if "心即理" in self.theory:
print("(心性即天理的哲学命题)")
使用示例:
system = PhilosophicalSystem("心即理")
system.demonstrate()
system.demonstrate() # 第二次调用会显示累计次数
输出效果:
═══════════════════════════════════
调用次数: 1
理论体系: 心即理
(心性即天理的哲学命题)
═══════════════════════════════════
类装饰器的独特优势:
- 可以维护调用状态(如计数器)
- 更容易实现复杂的装饰逻辑
- 支持更丰富的配置选项
- 便于扩展和继承
4. 装饰器选择指南与性能考量
面对三种装饰器实现,如何做出合理选择?下面这个对比表格总结了关键差异:
| 特性 | 基础装饰器 | 参数化装饰器 | 类装饰器 |
|---|---|---|---|
| 实现复杂度 | 低 | 中 | 高 |
| 配置灵活性 | 无 | 高 | 高 |
| 状态保持能力 | 无 | 有限 | 强 |
| 适用场景 | 简单增强 | 定制化需求 | 复杂逻辑 |
| 性能影响 | 小 | 中 | 中到大 |
性能优化建议:
- 对于高频调用的函数,避免在装饰器内部进行复杂计算
- 使用
functools.wraps保留原函数元信息 - 考虑使用
lru_cache缓存装饰器的计算结果
import functools
import time
def timing_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
end = time.perf_counter()
print(f"{func.__name__}执行耗时: {end - start:.4f}秒")
return result
return wrapper
这个计时装饰器不仅功能实用,还通过functools.wraps保持了原函数的__name__等属性,这在调试和日志记录时非常有用。
336



被折叠的 条评论
为什么被折叠?



