classmethod() și staticmethod() în Python

Clase și obiecte Python 3.0+

Metode care primesc clasa în loc de obiect (classmethod) sau nu primesc nici clasa, nici obiectul (staticmethod).

Sintaxă
@classmethod
def metoda(cls, ...): ...

@staticmethod
def functie(...): ...

Ce face classmethod() și staticmethod()

O metodă obișnuită primește obiectul ca self. Cu @classmethod, primește clasa ca cls; se folosește mai ales pentru „constructori alternativi”, de exemplu crearea unui obiect dintr-un text sau dintr-un dicționar.

Cu @staticmethod, metoda nu primește nimic automat: este o funcție obișnuită pusă în clasă pentru că ține de ea logic. Ambele pot fi apelate pe clasă sau pe obiect.

Parametri

Parametru Descriere
function Funcția transformată (de obicei se folosește forma cu decorator).

Ce returnează

Un obiect classmethod sau staticmethod.

Exemple

Exemplul 1: Constructor alternativ și funcție ajutătoare

class Data:
    def __init__(self, zi, luna, an):
        self.zi, self.luna, self.an = zi, luna, an

    @classmethod
    def din_text(cls, text):
        zi, luna, an = map(int, text.split("."))
        return cls(zi, luna, an)

    @staticmethod
    def e_bisect(an):
        return an % 4 == 0 and (an % 100 != 0 or an % 400 == 0)

d = Data.din_text("19.10.2026")
print(d.zi, d.luna, d.an)
print(Data.e_bisect(2024), d.e_bisect(2026))

Rezultat

19 10 2026
True False

Greșeli frecvente

  • Uiți decoratorul și apelezi metoda pe clasă: primești TypeError: missing 1 required positional argument.

Comenzi înrudite

  • class: Definește o clasă: un șablon pentru obiecte care au date (atribute) și comportament (metode).
  • property(): Transformă o metodă într-un atribut calculat, cu verificare la citire și la scriere.
  • super(): Apelează metoda clasei părinte dintr-o clasă care o moștenește.