【问题标题】:How to create a decorator function with arguments on python class?如何在 python 类上创建带有参数的装饰器函数?
【发布时间】:2013-03-11 23:10:19
【问题描述】:

我想创建一个装饰器函数来对 python 类进行操作,并能够传递额外的参数。我想在类实例化之前 这样做。这是我的方法:

def register(x,a):
    print x,a

@register(5)
class Foo(object):
    pass

x 是类,a 是附加参数。但我得到了一个

TypeError: register() takes exactly 2 arguments (1 given)

我想要的是在类被定义时(类被实例化之前)获取类Foo 和其他参数的方法。

【问题讨论】:

  • 如果你想这样做,你不需要定义一个接受两个参数的装饰器。您定义一个接受一个参数的函数(您的a),并让该函数返回一个接受一个参数(类)的装饰器。
  • 但是当我用一个参数定义函数时,它就是类!把上面的,a去掉两次,输出就是<class '__main__.Foo'>
  • @ArtsiomRudzenka 的解决方案效果很好

标签: python python-2.7 decorator


【解决方案1】:

你需要这样做:

def makeDeco(a):
    def deco(cls):
        print cls, a
        return cls
    return deco

>>> @makeDeco(3)
... class Foo(object):
...     pass
<class '__main__.Foo'> 3

您可以使用functools.wraps 等来修饰它,但这就是想法。您需要编写一个返回装饰器的函数。外部“装饰器制作”函数采用a 参数,内部装饰器函数采用类。

它的工作方式是,当您编写@makeDeco(3) 时,它会调用makeDeco(3)makeDeco返回值 是用作装饰器的。这就是为什么你需要makeDeco 来返回你想用作装饰器的函数。

【讨论】:

  • 您需要另一个嵌套函数才能使用@wraps
  • @Bren:我想这就是我需要的。但是有一个问题。 python怎么知道内部函数deco是装饰器?它只是外部函数内部的任何函数吗?
  • @Alex:@ 后面的表达式的返回值是用作装饰器的。调用makeDeco(3) 返回一个函数,因此该函数用作装饰器。请注意makeDeco 中的return deco
  • 是的,没错,我误读了第二个return 语句所属的位置...
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2014-03-24
  • 2012-03-14
  • 2020-09-05
相关资源
最近更新 更多