0Pricing
Python Academy · Lezione

@classmethod e @staticmethod

Definisca metodi di classe e metodi statici con i decorator appropriati.

@classmethod e @staticmethod è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.

Introduzione

@classmethod riceve la classe come primo argomento. @staticmethod non riceve nulla di speciale. Entrambi sono definiti nella classe.

Istanza, classe e statico

I metodi normali ricevono self. I metodi di classe ricevono cls. I metodi statici non ricevono nessuno dei due. Scelga in base ai dati di cui ha bisogno.
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

@classmethod come factory

L'uso più comune è rappresentato dai costruttori alternativi. Date.from_string('2024-01-15') invece di analizzare la stringa in __init__.
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

@classmethod con l'ereditarietà

In un classmethod, cls fa riferimento alla sottoclasse effettiva, non alla classe base. In questo modo i metodi factory funzionano correttamente con le sottoclassi.
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

@staticmethod per le utility

I metodi statici sono normali funzioni raggruppate logicamente con una classe. Non possono accedere ai dati della classe o dell'istanza.
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethod o funzione di modulo

Se una funzione non ha bisogno della classe, potrebbe essere una funzione a livello di modulo. Utilizzi @staticmethod solo quando appartiene logicamente alla classe.
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

Chiamare da un'istanza

È possibile chiamare sia @classmethod sia @staticmethod sulle istanze, ma il comportamento di cls e l'assenza del primo argomento non cambiano.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

Metodo di classe per i singleton

I classmethod possono imporre pattern singleton verificando se esiste già un'istanza.
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

Sovrascrivere i classmethod

Una sottoclasse può sovrascrivere un classmethod. In tal caso cls sarà la sottoclasse, mantenendo il polimorfismo.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

Controllo del tipo con cls

All'interno di un classmethod, cls è la classe effettiva. Utilizzi cls() per creare istanze: non codifichi direttamente il nome della classe.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

Combinare con @property

Un valore memorizzato nella cache a livello di classe può combinare @classmethod e un attributo di classe per ottenere una cache condivisa dalla classe.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

Controllo rapido

Che cos'è cls in un @classmethod?

Riepilogo

@classmethod riceve cls: lo utilizzi per factory, costruttori alternativi e singleton. @staticmethod non riceve nulla: lo utilizzi per le utility. cls è la (sotto)classe effettiva.

Continui

Ottimi progressi! Continui per padroneggiare il prossimo concetto.

Domande Frequenti

La lezione «@classmethod e @staticmethod» è gratuita?

Sì — il testo completo di «@classmethod e @staticmethod» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.

Cosa imparerò in «@classmethod e @staticmethod»?

Definisca metodi di classe e metodi statici con i decorator appropriati. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Python Academy?

Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «@classmethod e @staticmethod»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Python Academy?

Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Funzioni come oggetti di prima classe
  2. Scrittura di decorator personalizzati
  3. Il decorator @property
  4. @classmethod e @staticmethod
← Torna a Python Academy