我試圖理解某個類的某個單一裝飾器實現是如何工作的,但我只是感到困惑。裝飾器如何與Python中的類一起工作
下面的代碼:
def singleton(cls):
instance = None
@functools.wraps(cls)
def inner(*args, **kwargs):
nonlocal instance
if instance is None:
instance = cls(*args, **kwargs)
return instance
return inner
@deco
是cls = deco(cls)
一個語法糖,所以在這段代碼,當我們定義cls
類以及與此singleton
裝飾包裹它,cls
不會是一類了,而是一個功能。 Python會動態地搜索變量鏈接到的對象,所以後來我們嘗試創建我們的類的一個實例,並且這行代碼運行instance = cls(*args, **kwargs)
,我們不會進入無限遞歸嗎? cls
此時不是類,它是一個函數,所以它應該調用自己,進入遞歸。
但它工作正常。創建一個singletone並且不會發生遞歸。它是如何工作的?