python如何使用包里的类的方法_如何使用python-decorator包来装饰类方法?

I'm have a decorator that I want to use to decorate class methods. In the following example, the @mydec decorator works fine on its own, however it does not preserve the function signature when using help() or pydoc. In order to fix this, I looked at using @decorator python-decorator package:

import functools

import decorator

@decorator.decorator

def mydec(func):

@functools.wraps(func)

def inner(cls, *args, **kwargs):

# do some stuff

return func(cls, *args, **kwargs)

return inner

class Foo(object):

@classmethod

@mydec

def bar(cls, baz='test', qux=None):

print (baz, qux)

Foo.bar()

Unfortunately, this results in the following exception:

Traceback (most recent call last):

File "/tmp/test.py", line 21, in

Foo.bar()

File "", line 2, in bar

TypeError: mydec() takes exactly 1 argument (4 given)

解决方案

You do not need to provide your own wrapper anymore, just use @decorator.decorator on the inner function, which takes one extra first positional argument, the function wrapped:

@decorator.decorator

def mydec(func, cls, *args, **kwargs):

# do some stuff

return func(cls, *args, **kwargs)

The decorator package doesn't use a closure for decorators and instead passes in the wrapped function as an argument.

Demo:

>>> @decorator.decorator

... def mydec(func, cls, *args, **kwargs):

... # do some stuff

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

...

>>> class Foo(object):

... @classmethod

... @mydec

... def bar(cls, baz='test', qux=None):

... print (baz, qux)

...

>>> Foo.bar()

('test', None)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值