Python有任何AOP支持库吗?
我正在尝试在我的Python编程中使用一些面向切面编程(AOP),但我对现有的各种库没有任何经验。
所以我想问的问题是:
Python中有哪些AOP支持?不同库之间有什么优缺点?
编辑
我找到了一些,但我不知道它们之间的比较:
编辑 2
我会在什么情况下使用这些呢?
我有两个用Python写的应用程序,里面通常有一些计算税务和其他财务的功能。我希望能够写一个功能的“骨架”,并在运行时进行定制,比如改变地方税的计算方式(按国家、州或城市等)而不需要重构整个系统。
6 个回答
6
在Python中,面向切面的编程通常是指在程序运行时动态地修改类和实例,这种做法通常被称为“猴子补丁”。在我对另一个关于面向切面编程的问题的回答中,我总结了一些在Python中使用面向切面编程的案例。
25
可以看看S.Lott提供的关于Python装饰器的链接,里面有一些很棒的例子,还有这个关于装饰器的PEP定义。
Python从一开始就有面向切面编程(AOP),只是当时没有一个响亮的名字。在Python 2.4版本中,增加了装饰器的语法,这让使用装饰器变得更加简洁。
如果你想根据某些规则来使用装饰器,可能需要一个库,但如果你愿意在声明相关函数或方法时进行标记,可能就不需要了。
这里有一个简单的缓存装饰器的例子(我为这个问题写的):
import pickle, functools
def cache(f):
_cache = {}
def wrapper(*args, **kwargs):
key = pickle.dumps((args, kwargs))
if key not in _cache:
_cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache
return _cache[key] # read value from cache
functools.update_wrapper(wrapper, f) # update wrapper's metadata
return wrapper
import time
@cache
def foo(n):
time.sleep(2)
return n*2
foo(10) # first call with parameter 10, sleeps
foo(10) # returns immediately
7
补充说明:我不再维护pytilities这个库,它已经多年没有更新了。你可能想考虑其他答案,或者查看这个维基百科上的列表。
另一个适用于Python的AOP库是pytilities
(文档;代码库)。据我所知,它目前是功能最强大的。
它的功能包括:
- 创建可重用的切面类
- 将多个切面应用到一个实例或类上
- 从实例或类中移除切面
- 通过切面为实例添加新属性
- 对实例或类的所有属性应用建议
- ...
它还有其他一些好东西,比如一些特殊的描述符(具体可以查看文档)。