Przykład:
class MyClass: def instance_method(self): print(f"Instancja: {self}") @classmethod def class_method(cls): print(f"Klasa: {cls.__name__}") @staticmethod def static_method(): print("Zwykła funkcja") obj = MyClass() obj.instance_method() # self — to obj MyClass.class_method() # cls — to MyClass MyClass.static_method() # brak self/cls
Częste pytanie:
Czy metodę klasową można wywołać przez instancję? Czym to różni się od wywołania przez samą klasę?
Odpowiedź: Tak, metodę klasową można wywołać zarówno przez instancję, jak i przez samą klasę. Nie ma znaczenia, skąd jest wywołanie — pierwszym argumentem zawsze będzie klasa, a nie instancja. W przypadku wywołania przez instancję przekazany zostaje jej klasa jako cls.
Historia
W projekcie wszystkie metody fabryczne zostały zrobione statycznymi (@staticmethod), ale wewnątrz konieczne było uzyskanie nazwy klasy pochodnej — okazało się to niemożliwe. Poprawiono na @classmethod, aby uzyskać odwołanie do cls.
Historia
Do generowania unikalnych identyfikatorów instancji używano zwykłej metody (self), a powinno być to metodą klasową, ponieważ licznik powinien być wspólny dla klasy, a nie dla każdego obiektu.
Historia
Programista umieścił logikę biznesową, niezwiązaną z klasą, w metodzie statycznej wewnątrz klasy. Inni nie mogli znaleźć tej funkcji, ponieważ nie spodziewali się jej w przestrzeni innej klasy, co utrudniło utrzymanie.