我想在Python编程中使用一些AOP,但我没有任何经验来使用现有的各种库。
所以我的问题是:
Python存在哪些AOP支持?它们之间的不同库的优点是什么?
编辑
我找到了一些,但我不知道它们如何比较:
编辑2
我将在哪种情况下使用这些?
我有两个用Python编写的应用程序,通常具有计算税金和其他货币事物的方法。我想能够编写一个功能的“骨架”,并在运行时进行自定义,例如更改应用本地税收的方式(按国家、州或城市等方式),而不必重载整个栈。
我想在Python编程中使用一些AOP,但我没有任何经验来使用现有的各种库。
所以我的问题是:
Python存在哪些AOP支持?它们之间的不同库的优点是什么?
我找到了一些,但我不知道它们如何比较:
我将在哪种情况下使用这些?
我有两个用Python编写的应用程序,通常具有计算税金和其他货币事物的方法。我想能够编写一个功能的“骨架”,并在运行时进行自定义,例如更改应用本地税收的方式(按国家、州或城市等方式),而不必重载整个栈。
查看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
编辑:我不再维护pytilities,它已经多年未得到维护。您可能需要考虑其他答案之一,或者参考Wikipedia上的列表。
另一个Python AOP库是pytilities
(文档; svn仓库)。据我所知,它目前是最强大的。
它的特点包括:
它还有其他好东西,比如一些特殊的描述符(请参阅文档)
那么BSD许可的python-aspectlib怎么样呢?
实现状态
函数、方法、实例和类的编织已完成。
使用注解并不是真正的AOP,因为织入过程有点硬编码。
Python中有几个AOP框架(我数了一下并比较了8个,其中Aspyct
是明显的赢家)。
我将在接下来的会议上发表一篇论文,其中包括一个真实的工业用例。