繁体   English   中英

请帮助我理解这段代码是如何工作的(我认为正确的术语是“柯里化”……?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM