【发布时间】:2014-02-02 15:03:32
【问题描述】:
我正在使用相当大的 OOP 代码库,我想注入一些跟踪/日志记录。最简单的方法是在某些基类的某些方法周围引入一个装饰器,但不幸的是,装饰器不是继承的。
我确实尝试了以下方法:
def trace(fn):
def wrapper(instance, *args, **kwargs):
result = fn(instance, *args, **kwargs)
# trace logic...
return result
return wrapper
class BaseClass(object):
def __init__(self, ...):
...
self.__call__ = trace(self.__call__) # line added to end of method
...虽然 __call__ 方法 被 包装(我可以从将实例信息打印到控制台中看到),但 wrapper 函数没有按预期执行。 p>
我还简要地研究了使用基于 this answer 的元类,但它会立即破坏系统中使用自省的其他部分,所以我认为这是不行的。
有没有其他方法可以围绕继承自BaseClass 的类的__call__ 方法强制应用这些装饰器?
【问题讨论】:
-
所以您是说要将
__call__包裹在BaseClass及其所有子代中? -
@freakish:是的,有点。
__call__inBaseClass被所有子代(其中有很多)覆盖,因此在__call__周围应用装饰器在BaseClass级别是在一个地方一致地添加跟踪的最简单方法。 -
这是否与您要解决的问题相同,基类上的装饰器继承到子类。 stackoverflow.com/questions/3782040/…
标签: python inheritance decorator