如何使用 python-decorator 包来装饰类方法?
Posted
技术标签:
【中文标题】如何使用 python-decorator 包来装饰类方法?【英文标题】:How do I use the python-decorator package to decorate classmethods? 【发布时间】:2013-09-05 18:57:40 【问题描述】:我有一个装饰器,我想用它来装饰类方法。在下面的示例中,@mydec 装饰器本身可以正常工作,但是在使用 help() 或 pydoc 时它不会保留函数签名。为了解决这个问题,我查看了使用@decorator python-decorator 包:
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()
很遗憾,这会导致以下异常:
Traceback (most recent call last):
File "/tmp/test.py", line 21, in <module>
Foo.bar()
File "<string>", line 2, in bar
TypeError: mydec() takes exactly 1 argument (4 given)
【问题讨论】:
你试过颠倒装饰器的顺序吗? @OfirIsrael:问题在于mydec
装饰器,而不是排序。
【参考方案1】:
您不再需要提供自己的包装器,只需在 inner 函数上使用 @decorator.decorator
,它需要一个额外的第一个位置参数,即被包装的函数:
@decorator.decorator
def mydec(func, cls, *args, **kwargs):
# do some stuff
return func(cls, *args, **kwargs)
decorator
包不使用装饰器闭包,而是将包装函数作为参数传入。
演示:
>>> @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)
【讨论】:
啊,我误会怎么用了。这绝对让装饰器更干净。谢谢!以上是关于如何使用 python-decorator 包来装饰类方法?的主要内容,如果未能解决你的问题,请参考以下文章