python 类装饰器和继承_Python:强制装饰器继承?

我正在使用相当大的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值