【问题标题】:How does this piece of code work (I think the correct term is 'currying')请帮助我理解这段代码是如何工作的(我认为正确的术语是 \'currying\'...?)
【发布时间】:2022-12-12 09:06:59
【问题描述】:
我很难理解这段代码是如何工作的:
class add(int):
def __call__(self, int):
return add(self + int)
result = add(2)
print(result(4))
int 2 似乎存储在结果中(不确定是否是这种情况 tbh),因此当我们打印(结果)时,输出为 2。运行打印(结果(4))时,输出变为 6。我的问题是……这是为什么?实际上,数字 2 存储在结果中吗?如果我们在没有参数的情况下实例化 add 类,结果变量将输出数字 0。幕后发生了什么?
我想了解为什么调用 result(2)(3)(4) 输出 9。
【问题讨论】:
标签:
python
class
methods
overriding
currying
【解决方案1】:
add 是 int 的子类。因此,它的行为与我们期望的 int 实例的行为完全一样。因此,例如,它的“默认”y 值为 0。这就是为什么 print(add()) 为 0(因为 int() 为 0)。
现在,我们实现了__add__方法。根据data-model,__add__ 方法允许实现它的类的实例是可调用的,即用于() 的左侧,有或没有参数。
由于您允许 __call__ 接受参数并将此参数添加到实例当前表示的值(请记住 add 实例的行为就像普通的 int 一样),我们可以调用 add 的实例争论并期待你观察到的行为。
回顾一下,add(2) 为我们提供了一个表示整数 2 的对象(就像 int(2) 一样),并具有能够使用将添加到其自身值的参数调用它的附加功能(因此 @987654337 @ 只是 2 + 3)。