相关疑难解决方法(0)

基于Python类的装饰器,其参数可以修饰方法或函数

我见过很多Python装饰器的例子:

  • 函数样式装饰器(包装函数)
  • 类风格装饰(实施__init__,__get__和__call__)
  • 不带参数的装饰器
  • 带参数的装饰器
  • "方法友好"的装饰器(即可以在类中装饰方法)
  • "函数友好"的装饰器(可以装饰普通函数
  • 可以装饰方法和功能的装饰器

但我从来没有见过一个可以完成上述所有工作的例子,而且我很难从特定问题的各种答案中综合出来(比如这一个,这一个,或者这一个(它有一个最好的答案)我曾见过SO)),如何结合以上所有内容.

我想要的是一个基于类的装饰器,它可以装饰方法或函数,并且至少需要一个额外的参数.即以下内容可行:

class MyDecorator(object):
    def __init__(self, fn, argument):
        self.fn = fn
        self.arg = argument

    def __get__(self, ....):
        # voodoo magic for handling distinction between method and function here

    def __call__(self, *args, *kwargs):
        print "In my decorator before call, with arg %s" % self.arg
        self.fn(*args, **kwargs)
        print "In my decorator after call, with arg %s" …
Run Code Online (Sandbox Code Playgroud)

python methods arguments function decorator

39
推荐指数
3
解决办法
2万
查看次数

在Python 3中获取未绑定方法对象的定义类

假设我想为类中定义的方法创建装饰器.我希望装饰器在被调用时能够在定义方法的类上设置属性(以便将其注册到用于特定目的的方法列表中).

在Python 2中,该im_class方法很好地完成了这个:

def decorator(method):
  cls = method.im_class
  cls.foo = 'bar'
  return method
Run Code Online (Sandbox Code Playgroud)

但是,在Python 3中,似乎不存在这样的属性(或替代它).我想这个想法是你可以调用type(method.__self__)来获取类,但是这对于未绑定的方法不起作用,因为__self__ == None在那种情况下.

注意:这个问题实际上与我的情况有点无关,因为我选择在方法本身上设置属性,然后让实例扫描其所有方法,在适当的时间查找该属性.我(目前)也在使用Python 2.6.但是,我很好奇是否有替换版本2的功能,如果没有,那么完全删除它的理由是什么.

编辑:我刚发现这个问题.这使得看起来最好的解决方案就是像我一样避免它.我仍然想知道为什么它被删除了.

python python-3.x

35
推荐指数
3
解决办法
2万
查看次数

标签 统计

python ×2

arguments ×1

decorator ×1

function ×1

methods ×1

python-3.x ×1