Python有任何AOP支持库吗?

31 投票
6 回答
17818 浏览
提问于 2025-04-11 20:53

我正在尝试在我的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文档代码库)。据我所知,它目前是功能最强大的。

它的功能包括:

  • 创建可重用的切面类
  • 将多个切面应用到一个实例或类上
  • 从实例或类中移除切面
  • 通过切面为实例添加新属性
  • 对实例或类的所有属性应用建议
  • ...

它还有其他一些好东西,比如一些特殊的描述符(具体可以查看文档)。

撰写回答