ProgrammazioneSviluppatore Python

Spiega la differenza tra un metodo di classe (@classmethod), un metodo statico (@staticmethod) e un metodo di istanza in Python. Quando e cosa scegliere?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

  • Metodo di istanza — riceve come primo argomento self, quindi un riferimento a un oggetto specifico. Viene utilizzato per accedere/modificare lo stato dell'oggetto.
  • @classmethod riceve come primo argomento cls — un riferimento alla classe stessa, non all'oggetto. Viene utilizzato per metodi di fabbrica o metodi che operano sull'intera classe.
  • @staticmethod non riceve affatto argomenti impliciti. È una funzione normale, inserita nello spazio del nome della classe — per raggruppamento logico.

Esempio:

class MyClass: def instance_method(self): print(f"Istanze: {self}") @classmethod def class_method(cls): print(f"Classe: {cls.__name__}") @staticmethod def static_method(): print("Solo una funzione") obj = MyClass() obj.instance_method() # self — è obj MyClass.class_method() # cls — è MyClass MyClass.static_method() # non ci sono self/cls

Domanda insidiosa.

Domanda comune:

È possibile chiamare un metodo di classe tramite un'istanza? In cosa è diverso dalla chiamata tramite la classe stessa?

Risposta: Sì, un metodo di classe può essere chiamato sia tramite un'istanza che tramite la classe stessa. Non importa da dove viene la chiamata: il primo argomento sarà sempre la classe, non l'istanza. Quando viene chiamato tramite l'istanza, la sua classe viene passata come cls.

Esempi di errori reali a causa della mancanza di conoscenze sulle sfumature dell'argomento.


Storia

Nel progetto, tutti i metodi di fabbrica sono stati fatti statici (@staticmethod), ma all'interno era necessario conoscere il nome della classe derivata — questo si è rivelato impossibile. Si è corretto in @classmethod, per ottenere il riferimento a cls.


Storia

Per generare identificatori univoci delle istanze, è stato utilizzato un metodo normale (self), mentre ci voleva un metodo di classe, poiché il contatore deve essere comune alla classe e non a ciascun oggetto.


Storia

Un sviluppatore ha messo la logica di business non correlata alla classe in un metodo statico all'interno della classe. Gli altri non sono stati in grado di trovare questa funzione, perché non si aspettavano di trovarla nello spazio di un'altra classe, rendendo difficile la manutenzione.