我正在使用相当大的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__方法被包装时(我可以从打印实例信息到控制台看到),包装函数不会按预期执行.
我还简要介绍了使用基于this answer的元类,但是它会立即打破使用内省的系统的其他部分,所以我认为这是不行的.
有没有其他方法可以强制应用这些装饰器围绕从BaseClass继承的类的__call__方法?
解决方法:
为什么元编程会搞乱内省?也许你没有正确使用它?试试这个(假设Python2.x):
class MyMeta(type):
def __new__(mcl, name, bases, nmspc):
if "__call__" in nmspc:
nmspc["__call__"] = trace(nmspc["__call__"])
return super(MyMeta, mcl).__new__(mcl, name, bases, nmspc)
class BaseClass(object):
__metaclass__ = MyMeta
然后,您可以直接从BaseClass继承,__ call__将自动包装.
我不确定什么样的内省可以打破这种情况.除非BaseClass实际上不是从对象继承而是从实现它自己元的东西?但是你可以通过强制MyMeta继承父父的元(而不是类型)来处理这种情况.
标签:python,decorator,inheritance