簡體   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