[英]Please help me understand how this piece of code works (I think the correct term is 'currying'...?)
我很难理解这段代码是如何工作的:
class add(int):
def __call__(self, int):
return add(self + int)
result = add(2)
print(result(4))
int 2 似乎存储在结果中(不确定是否是这种情况 tbh),这样当我们打印(结果)时,output 为 2。当运行打印(结果(4))时,output 变为 6。我的问题是……这是为什么? 实际上,数字 2 存储在结果中吗? 如果我们在没有参数的情况下实例化 add class,结果变量将为 output 数字 0。这里发生了什么?
我想了解为什么调用 result(2)(3)(4) 输出 9。
这个 class 的作用是,它使整数能够被称为 function,因此a(b)
实际上意味着a+b
。 想象有一天,这个功能被添加到 python 解释器中。 然后你可以写2(3)
并得到5
。 但是5
仍然是可调用的,所以我们可以执行5(4)
并得到9
,或者,链接在一起, 2(3)(4) => 9
。
在实际的 python 中这是不可能的(数字文字总是int
),所以我们必须明确命名我们的 class (如add(2)(3)(4)
),但原则保持不变。
“柯里化”不是这里发生的事情。
add
是 class 的子类int
。 因此,它的行为与我们期望的int
实例的行为完全一样。 因此,例如,它的“默认”y 值为 0。这就是print(add())
为 0 的原因(因为int()
为 0)。
现在,我们实现了__add__
方法。 根据data-model , __add__
方法允许实现它的类的实例是可调用的,即用于()
的左侧,有或没有参数。
由于您允许__call__
接受参数并将此参数添加到实例当前表示的值(请记住add
实例的行为就像普通的int
一样),我们可以使用参数调用add
的实例并期望您观察到的行为.
回顾一下, add(2)
为我们提供了一个 object 表示 integer 2
(就像int(2)
一样),并增加了能够使用将添加到它自己的值的参数来调用它的功能(所以add(2)(3)
就是2 + 3
)。
我们可以添加一些print
以查看发生了什么,最好不要在__call__
的定义中使用名称int
,因为我们不想隐藏类型int
(即add
class 子类)。 如果您还不熟悉它,请忽略对super().__init__()
的调用,它允许我们打印消息)。
class add(int):
def __init__(self, own_value):
print(f"Created 'add' with own_value {own_value}")
super().__init__()
def __call__(self, number):
print(f"Inside __call__ with number {number}, will return new 'add' with own_value {self + number}")
return add(self + number)
result = add(2)
print(result(4))
产出
Created 'add' with own_value 2
Inside __call__ with number 4, will return new 'add' with own_value 6
Created 'add' with own_value 6
6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.