Python装饰器 - 参数来自哪里?

时间:2015-09-08 22:10:43

标签: python override python-decorators

我已阅读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语句检查我们要覆盖的方法是否真的在接口中,我们将其作为参数提供。这是实际使用的,因为现在我们不能覆盖现有的方法。如果我们仍然试图这样做,我们的断言就会失败。
  4. 但是我仍然没有得到参数method的来源以及为什么它始终是我们想要覆盖方法的类的方法而不是实例。一堂课#39;方法通常有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)
    

1 个答案:

答案 0 :(得分:1)

你的第二点无效:

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

技术上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)