我正在尝试在我的Python编程中使用一些AOP,但我没有任何存在的各种库的经验。
所以我的问题是:
Python存在哪些AOP支持?它们之间的差异库有什么优势?
我找到了一些,但我不知道他们如何比较:
我会在哪种情况下使用这些?
我有两个用Python编写的应用程序,它们通常有计算税收和其他金钱的方法。我希望能够编写一个功能的“骨架”,并在运行时自定义它,例如更改地方税的应用方式(按国家,州或城市等),而不必重载满满的。
答案 0 :(得分:23)
有关一些很好的示例,请参阅S.Lott关于Python装饰器的链接,并参阅defining PEP for decorators。
Python从一开始就有AOP,它没有一个令人印象深刻的名字。 在Python 2.4中添加了装饰器语法,这使得装饰器在语法上非常好用。
也许如果你想根据规则应用装饰器你需要一个库,但如果你愿意在声明它们时标记相关的函数/方法,你可能不会。
这是一个简单的缓存装饰器的例子(我为this question写了一个):
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
答案 1 :(得分:7)
编辑:我不再保持热情,多年来一直没有维护。您可能需要考虑其他答案之一或此list on Wikipedia。
另一个用于python的AOP库将是pytilities
(Documentation; svn repo)。它目前是最强大的(据我所知)。
它的特点是:
它还有其他一些好东西,比如一些特殊描述符(参见文档)
答案 2 :(得分:5)
在Python中,面向方面的编程通常包括在运行时动态修改类和实例,这通常称为monkeypatching。在回答另一个AOP问题时,我总结了其中一些use cases for AOP in Python。
答案 3 :(得分:4)
使用注释并不是真正的AOP,因为编织过程有点硬编码。
Python中有几个AOP框架(我计算并比较了其中的8个,其中Aspyct
是明显的赢家。)
我将在下一次会议之一上发表一篇论文,其中包括一个真实的行业用例。
答案 4 :(得分:1)
我从Python Decorator Library开始。其中大部分是AOP类的东西。
答案 5 :(得分:1)
BSD许可python-aspectlib怎么样?
实施状态
完成编织函数,方法,实例和类。