在Python 3,你可以這樣創建類:創建一個仿函數的調用類或嵌套函數
class foo:
def __init__(self, x):
self.x=x
def __call__(self, y):
self.x = self.x + 1
return (self.x, y)
然後可以用這樣的狀態把它作爲一個函子:
functor = foo(5)
x = 44354234
print('(1.1) ', functor(7))
print('(1.2) ', functor(8))
print('(1.2) ', functor(9))
在實踐中,我創建了一個返回函數的函數。但是,這第一個函數實際上是一個返回可調用對象的構造函數。恕我直言,這可以通過允許開發人員擴展類,添加方法等來打開一堆蠕蟲。此外,__init__
中的代碼在某種程度上自然地先於__call__
中的代碼,因爲它需要執行,並且在類結構。最後,Python 3'的方式'建議使用函數而不是類。
爲此,我創建的類的一個類似功能的版本,它具有較小的樣板代碼和恕我直言,讀取更自然:
def bar(x):
def f(y):
nonlocal x
x = x + 1
return (x,y)
return f
functor2 = bar(5)
x = 345234234
print('(2.1) ', functor2(7))
print('(2.2) ', functor2(8))
print('(2.3) ', functor2(9))
但是,它使用nonlocal
,可能不直觀的原因,我有沒有想到。第二種方法是不錯的做法,還是存在危險的剔骨? Python 3中應該首選哪個?特別是因爲我幾乎沒有使用nonlocal
的經驗。
*「恕我直言,這允許開發者來擴展類打開了一罐蠕蟲」 * - 這是一件壞事,爲什麼?另外,我不確定問題是什麼。哪些會被優先考慮?使用更有意義的東西。 – poke
「此外,__init__中的代碼自然先於__call__中的代碼,因爲它需要執行,而且在類構造中不明確。」 =>它**清楚地表明初始化__將在它甚至可以調用'__call__'之前被執行。 –
「最後,Python 3'的方式'建議使用函數而不是類':章節和詩歌?無論版本FWIW如何,「Python方式」都是使用對當前任務有意義的構造。在這種情況下,兩者都是有意義的,但第一個允許子類化和簡單的檢查。 –