python装饰器类-Python装饰器15-开始使用类作为装饰器

基于前面的使用函数作为装饰器的理解,将类作为装饰器时需要保证以下几点

类的实例是可调用的

类需要一个地方讲被装饰的函数传入到类的实例里

第一条可以通过__call__实现,第二条可以通过__init__实现。

手工将类作为装饰器使用

class Profiled:

def __init__(self, func):

# wraps(func)(self)

self.func = func

def __call__(self, *args, **kwargs):

print("call")

return self.func(*args, **kwargs)

def add(x, y):

return x + y

add = Profiled(add)

result = add(1, 2)

print(result)

执行结果:

call

3

似乎再用语法糖包装一下就可以实现将类作为装饰器来使用了。

使用类作为装饰器使用

from functools import wraps

class Profiled:

def __init__(self, func):

# wraps(func)(self)

self.func = func

def __call__(self, *args, **kwargs):

print("call")

return self.func(*args, **kwargs)

@Profiled

def add(x, y):

return x + y

result = add(1, 2)

print(result)

运行结果同上。

小结

这节我们以我们理解的方法实现了将类作为装饰器使用,看起来都很正确,似乎就是这样使用?但是这种方法还有一些别的问题,最重要的是同样的问题,可以在代码中使用:

print(add.__name__)

发现无法输出__name__,根据约定使用装饰器不能改变函数的__name__属性,因此我们还需要改进将类作为装饰器的使用方法。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值