Szukam praktycznych i niesyntetycznych przypadków użycia dekoratorów klasy Python. Jak dotąd jedynym przypadkiem, który miał dla mnie sens, było zarejestrowanie klasy w systemie wydawcy-subskrybenta, np. Wtyczek lub wydarzeń, coś w rodzaju:
@register
class MyPlugin(Plugin):
pass
lub
@recieves_notifications
class Console:
def print(self, text):
...
Wszelkie inne rozsądne przypadki, o których myślałem, mogłyby zostać zbudowane na podstawie dziedziczenia, metaklas lub metod dekoracyjnych. Czy możesz podać jakieś dobre (lub złe!) Przykłady korzystania z dekoratorów klas?
Dziękuję Ci!
ABCMeta
, a nie@abstractclass
dekorator klas.Odpowiedzi:
Pisząc testy jednostkowe posiadające
@unittest.skipIf
i@unittest.skipUnless
mogą być użyte na poszczególnych metodach lub na całejunittest.TestCase
definicji klasy. To znacznie ułatwia pisanie testów problemów specyficznych dla platformy.Przykład z
asyncio/test_selectors
źródło
Dekoratorzy klas zostali wyraźnie stworzeni, aby uczynić niektóre rzeczy, które były już możliwe do wyrażenia poprzez metaklasy, z PEP :
źródło
Z tego pytania o przepełnienie stosu:
źródło
Poszukiwanie przypadków użycia z dekoratorami na zajęciach jest daremne - wszystko , co można zrobić z dekoratorami na zajęciach, można wykonać za pomocą metaklas. Nawet twój przykład rejestracji. Aby to udowodnić, oto metaklasa, która stosuje dekoratora:
Python 2:
Python 3:
źródło