【问题标题】:Python decorators - Where do parameters come from?Python 装饰器——参数从何而来?
【发布时间】:2015-12-04 17:53:26
【问题描述】:

我已经阅读了this SO questionaccepted 的答案。

引用:

def overrides(interface_class):
    def overrider(method):
        assert(method.__name__ in dir(interface_class))
        return method
    return overrider

但是,如果我覆盖任意方法,我仍然不确定参数method 的来源。

我将尝试解释到目前为止我所理解的:

  1. 外部函数从装饰器的符号中获取其参数。装饰器获取一个参数,即接口,我们从中获取我们想要覆盖的方法。
  2. 装饰器的结果是function,它将替换我们用这个装饰器装饰的函数。
  3. assert 语句检查我们想要覆盖的方法是否真的在接口中,我们将其作为参数提供。这就是实际用途,因为现在我们不能覆盖不存在的方法。如果我们仍然尝试这样做,我们将有一个失败的断言。

但我仍然不明白参数method 的来源以及为什么它总是方法而不是类的实例,我们要在其中重写方法。一个类的方法通常有self作为参数,它引用了实例,还是错了?

我还阅读了this 网站。似乎在他们的示例中,装饰器必须采用与装饰函数相同的参数。

那我们怎么突然有了方法而不是类作为参数呢?

编辑#1:this website 上,我找到了示例,其中外部函数接收将被装饰的函数,而不是该函数或装饰器的参数。装饰器如何工作的逻辑似乎取决于装饰是否有参数的条件。但这些规则是什么?

来自该网站的示例:

def pass_thru(func_to_decorate):
    def new_func(*original_args, **original_kwargs):
        print "Function has been decorated.  Congratulations."
        # Do whatever else you want here
        return func_to_decorate(*original_args, **original_kwargs)
    return new_func


# Notice nothing here now
def print_args(*args):
    for arg in args:
        print arg


# Notice the change here
pass_thru(print_args)(1, 2, 3)

【问题讨论】:

  • 当被调用者非常爱调用者时,他们会聚在一起并做一些小参数,然后鹳鸟就会掉在括号中
  • @JoranBeasley 你是说,当一个方法被调用时,例如像这样:foo(self) 它变成foo, self 其中第一个参数总是方法名称,self 变成一条消息到方法名foo?的方法
  • 不抱歉,我基本上只是个聪明人:/ ...标题让我想到了“婴儿从哪里来?”

标签: python overriding python-decorators


【解决方案1】:

您的第二点无效:

  1. 装饰器的结果是function,它将替换我们用这个装饰器装饰的函数。

技术上overrides 返回用于该方法的装饰器。而不是

class Class(object):
    @overrides(Interface)
    def method(self):
        pass

你可以写

class Class(object):
    overrider = overrides(Interface)
    @overrider
    def method(self):
        pass

您可以在 motivation for decorators 中找到,您将拥有一个类似于类似的构造

class Class(object):
    def method(self):
        pass
    method = overrides(Interface)(method)

【讨论】:

  • 我明白了。好的,所以我将那个装饰器作为返回值,但是你会如何描述,装饰器是如何应用于被装饰函数的呢?
  • @Zelphir 希望这会有所帮助
  • 这可以解释method 的来源,但我仍然不明白thecodeship.com/patterns/guide-to-python-function-decorators 上的示例。为什么他们可以使用namename 不是方法,所以这个案例似乎有一些特殊之处,这使它与链接的案例不同。
  • @Zelphir 我不确定你不明白哪一部分。 name 只是被包装的函数和包装器的参数。
  • 我不明白在一种情况下它是参数,而在另一种情况下是函数。怎么可能是两件事?
猜你喜欢
  • 2010-12-25
  • 2011-11-21
  • 2014-07-21
  • 2018-01-21
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多