Metodo di classe Python ()

Il metodo classmethod () restituisce un metodo di classe per la funzione data.

La sintassi del classmethod()metodo è:

 classmethod (funzione)

classmethod()è considerato non Pythonic, quindi nelle versioni più recenti di Python, puoi usare il @classmethoddecoratore per la definizione del metodo di classe.

La sintassi è:

 @classmethod def func (cls, args …)

classmethod () Parametri

classmethod() metodo accetta un singolo parametro:

  • funzione - Funzione che deve essere convertita in un metodo di classe

Valore restituito da classmethod ()

classmethod() restituisce un metodo di classe per la funzione data.

Cos'è un metodo di classe?

Un metodo di classe è un metodo che è associato a una classe piuttosto che al suo oggetto. Non richiede la creazione di un'istanza di classe, proprio come staticmethod.

La differenza tra un metodo statico e un metodo di classe è:

  • Il metodo statico non sa nulla della classe e si occupa solo dei parametri
  • Il metodo della classe funziona con la classe poiché il suo parametro è sempre la classe stessa.

Il metodo della classe può essere chiamato sia dalla classe che dal suo oggetto.

 Class.classmethod () O anche Class (). Classmethod ()

Ma non importa cosa, il metodo di classe è sempre associato a una classe con il primo argomento come la classe stessa cls.

 def classMethod (cls, args …)

Esempio 1: creare un metodo di classe utilizzando classmethod ()

 class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()

Produzione

 L'età è: 25 anni 

Qui abbiamo una classe Person, con un'età variabile membro assegnata a 25.

Abbiamo anche una funzione printAgeche prende un solo parametro cls e selfche di solito non prendiamo.

cls accetta la classe Personcome parametro piuttosto che l'oggetto / istanza di Person.

Ora, passiamo il metodo Person.printAgecome argomento alla funzione classmethod. Questo converte il metodo in un metodo di classe in modo che accetti il ​​primo parametro come una classe (cioè Persona).

Nella riga finale, chiamiamo printAgesenza creare un oggetto Person come facciamo per i metodi statici. Stampa la variabile di classe age.

Quando usi il metodo di classe?

1. Metodi di fabbrica

I metodi factory sono quei metodi che restituiscono un oggetto classe (come il costruttore) per diversi casi d'uso.

È simile al sovraccarico delle funzioni in C ++. Poiché Python non ha nulla in quanto tale, vengono utilizzati metodi di classe e metodi statici.

Esempio 2: creare un metodo di fabbrica utilizzando il metodo di classe

 from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) person = Person('Adam', 19) person.display() person1 = Person.fromBirthYear('John', 1985) person1.display()

Produzione

 L'età di Adamo è: 19 L'età di Giovanni è: 31 

Qui abbiamo due creatori di istanze di classe, un costruttore e un fromBirthYearmetodo.

Il costruttore accetta i normali parametri name ed age. Mentre, fromBirthYearprende classe, nome e anno di nascita, calcola l'età corrente sottraendola con l'anno corrente e restituisce l'istanza della classe.

Il metodo fromBirthYear accetta la classe Person (non l'oggetto Person) come primo parametro cls e restituisce il costruttore chiamando cls(name, date.today().year - birthYear), che è equivalente aPerson(name, date.today().year - birthYear)

Prima del metodo, vediamo @classmethod. Questo è chiamato decoratore per la conversione fromBirthYearin un metodo di classe come classmethod().

2. Correggere la creazione dell'istanza nell'ereditarietà

Ogni volta che si deriva una classe dall'implementazione di un metodo factory come metodo di classe, garantisce la corretta creazione dell'istanza della classe derivata.

È possibile creare un metodo statico per l'esempio precedente, ma l'oggetto che crea sarà sempre codificato come classe Base.

Tuttavia, quando si utilizza un metodo di classe, viene creata l'istanza corretta della classe derivata.

Esempio 3: come funziona il metodo di classe per l'ereditarietà?

 from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @staticmethod def fromFathersAge(name, fatherAge, fatherPersonAgeDiff): return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff) @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) class Man(Person): sex = 'Male' man = Man.fromBirthYear('John', 1985) print(isinstance(man, Man)) man1 = Man.fromFathersAge('John', 1965, 20) print(isinstance(man1, Man))

Produzione

 Vero falso 

In questo caso, l'utilizzo di un metodo statico per creare un'istanza di classe richiede di codificare il tipo di istanza durante la creazione.

Questo chiaramente causa un problema quando si eredita Personda Man.

fromFathersAgemetodo non restituisce un Manoggetto ma l'oggetto della sua classe base Person.

Ciò viola il paradigma OOP. L'utilizzo di un metodo di classe as fromBirthYearpuò garantire la OOP-ness del codice poiché accetta il primo parametro come la classe stessa e chiama il suo metodo di fabbrica.

Articoli interessanti...