Python的任何AOP支持库?

edo*_*aur 28 python aop

我试图在我的Python编程中使用一些AOP,但我没有任何存在的各种库的经验.

所以我的问题是:

Python存在哪些AOP支持?它们之间的不同库有什么优势?


编辑

我找到了一些,但我不知道他们如何比较:

编辑2

在哪种情况下我会使用这些?

我有两个用Python编写的应用程序,它们通常有计算税收和其他金钱的方法.我希望能够编写一个功能的"骨架",并在运行时自定义它,例如更改地方税的应用方式(按国家,州或城市等),而不必重载全栈.

ori*_*rip 24

有关一些很好的示例,请参阅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
Run Code Online (Sandbox Code Playgroud)

  • 我不相信装饰和AOP是一回事.恕我直言,使用AOP,您应该能够在不使用现有代码的情况下向现有代码添加新行为. (11认同)
  • 是的.我认为memoization是一个简单概念的奇特名称,可以使它更难理解.我对"AOP"这个词有类似的感受. (3认同)
  • @rds在Python中,您只需修补现有代码而无需直接修改它.你不需要花哨的术语和技巧...... (3认同)

小智 7

另一个用于python的AOP库将是pytilities.它是目前最强大的(据我所知).

它的特点是:

  • 制作可重复使用的Aspect类
  • 将多个方面应用于实例或类
  • 实例/类的unapply方面
  • 使用方面向实例添加新属性
  • 将建议应用于实例/类的所有属性
  • ...

它还有其他一些好东西,比如一些特殊的描述符(参见文档)


Eli*_*ght 6

在Python中,面向方面的编程通常包括在运行时动态修改类和实例,这通常称为monkeypatching.在回答另一个AOP问题时,我总结了Python中AOP的一些用例.