Próbowałem zrozumieć, jak działa pewna implementacja dekoratora singleton dla klasy, ale tylko się zdezorientowałem.Jak działają dekoratory z klasami w pythonach
Oto kod:
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
jest cukrem syntatic dla cls = deco(cls)
, więc w tym kodzie, gdy definiujemy naszą cls
klasę i owinąć go z tego singleton
dekoratora, cls
nie będzie klasa anymore , ale funkcja. Python dynamicznie wyszukuje, do jakich obiektów są przypisane zmienne, więc później staramy się utworzyć instancję naszej klasy, a ta linia kodu działa instance = cls(*args, **kwargs)
, czy nie przejdziemy do nieskończonej rekursji? cls
nie jest w tej chwili klasą, jest funkcją, więc powinien się wywoływać, wchodząc w rekursję.
Ale działa dobrze. Tworzy się singletone i nie ma rekurencji. Jak to działa?