我已阅读this SO question和accepted回答。
引用:
def overrides(interface_class):
def overrider(method):
assert(method.__name__ in dir(interface_class))
return method
return overrider
但是,我仍然不确定参数method
的来源,如果我覆盖任意方法。
我会尝试解释到目前为止我所理解的内容:
function
,它将替换我们用这个装饰器装饰的函数。但是我仍然没有得到参数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)
答案 0 :(得分: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)