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