【发布时间】:2015-12-04 17:53:26
【问题描述】:
我已经阅读了this SO question 和accepted 的答案。
引用:
def overrides(interface_class):
def overrider(method):
assert(method.__name__ in dir(interface_class))
return method
return overrider
但是,如果我覆盖任意方法,我仍然不确定参数method 的来源。
我将尝试解释到目前为止我所理解的:
- 外部函数从装饰器的符号中获取其参数。装饰器获取一个参数,即接口,我们从中获取我们想要覆盖的方法。
装饰器的结果是function,它将替换我们用这个装饰器装饰的函数。- 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