Ho cercato di capire come funziona una certa implementazione di un decoratore singleton per una classe, ma sono solo confuso.Come i decoratori lavorano con le classi in python
Ecco il codice:
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
è uno zucchero syntatic per cls = deco(cls)
, quindi in questo codice, quando definiamo la nostra classe cls
e avvolgerlo con questo singleton
decoratore, cls
sarà non essere più una classe , ma una funzione. Python cerca in modo dinamico per quali oggetti sono collegate le variabili, quindi in seguito proveremo a creare un'istanza della nostra classe, e questa linea di codice gira instance = cls(*args, **kwargs)
, non andremo in una ricorsione infinita? cls
non è una classe in questo momento, è una funzione, quindi dovrebbe chiamarsi, andare in ricorsione.
Ma funziona correttamente. Viene creato un singletone e non si verificano ricorsioni. Come funziona?