如何使用 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 包来装饰类方法?的主要内容,如果未能解决你的问题,请参考以下文章

单调队列优化多重背包

Ubuntu/Debian下的安装包装换工具—alien

如何使用与同一数据库交互的外部 python 包来构建 Django 项目

来装个Windows NT吧!

初始决策树与随机森林

6600XT适合ITX主机吗?来装一台Deep Dark全黑ITX主机