一、基本概念
两个编程范式:
- 面向对象编程(
OOP, Object-Oriented Programming
),OOP
将系统看作多个对象的交互,它将程序中的数据和操作数据的方法封装在对象中,通过对象之间的交互来实现程序的设计和实现。 - 面向切面编程(
AOP, Aspect-Oriented Programming
),AOP
将系统分解为不同的关注点,它将程序中横切的关注点(如日志、安全、事务管理等)与主要业务逻辑分离,通过切面来处理这些横切关注点。
三个基本概念:
- 关注点:关注点是指具有相似目标的一组功能。例如,一个购物网站中的用户注册、登录、购物车管理等就是不同的关注点,它们分别关注着用户身份验证、用户行为记录、购物车状态管理等功能。
- 横切关注点:当一个功能或问题横跨多个模块或关注点时,称之为横切关注点。例如,在一个购物网站中,日志记录可能涉及用户注册、登录、购物车管理等多个关注点,日志记录就是一个横切关注点。
- 切面:切面是用于处理横切关注点的模块或组件。在购物网站的例子中,日志记录就是一个切面,它负责处理用户在不同功能中的操作记录。切面提供了一种将横切关注点的通用功能与具体功能分离的机制。
生活中的例子:
- 在厨房中,不同区域如备菜区、烹饪区等代表不同的关注点,每个区域有着独特的功能。
- 清洁卫生作为一个切面,贯穿于各个区域,横切关注每个区域的卫生状况,确保整体环境的清洁。
二、核心思想
AOP
的核心思想是:通过在关注点周围织入切面,将横切关注点的代码分离出来,将通用功能模块化,提高代码的可维护性和可读性。
三、Demo 示例
示例 1:日志记录
import functools def logging_decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): print(f"Logging: Calling function {func.__name__}") result = func(*args, **kwargs) print(f"Logging: Function {func.__name__} executed") return result return wrapper @logging_decorator def add(a, b): return a + b result = add(2, 3) print(result)
输出结果:
Logging: Calling function add Logging: Function add executed 5
示例说明:
这个示例演示了使用装饰器实现简单的日志记录功能,将日志记录从核心的加法函数中分离出来。
示例 2:性能监测
import time import functools def performance_decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"Performance: Function {func.__name__} executed in {end_time - start_time} seconds") return result return wrapper @performance_decorator def multiply(a, b): time.sleep(2) return a * b result = multiply(5, 4) print(result)
输出结果:
Performance: Function multiply executed in 2.001655340194702 seconds 20
示例说明:
这个示例演示了使用装饰器实现性能监测功能,记录函数执行时间,而不修改核心的乘法函数。
四、要点小结
- 面向切面编程的产生是为了解决模切关注点散乱在代码中的问题。
- 它的核心思想是在关注点周围织入切面,将横切关注点的代码分离出来,实现功能的模块化。
- 在 Python 中,装饰器是实现面向切面编程的一种方式。