English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Il metodo classmethod() restituisce il metodo di classe di una funzione data.
La sintassi del metodo classmethod() è:
classmethod(function)
Il decoratore @classmethod è considerato non conforme alla specifica di Python, quindi nelle versioni più recenti di Python, è possibile definire i metodi di classe con il decoratore @classmethod.
La sintassi è:
@classmethod def func(cls, args...)
Il metodo classmethod() accetta un parametro:
function-Funzione da convertire in metodo di classe
Il metodo classmethod() restituisce il metodo di classe di una funzione data.
I metodi di classe sono metodi associati al tipo e non agli oggetti. Non è necessario creare un esempio di classe, comeclassmethod (metodo statico)uguali.
La differenza tra metodi statici e metodi di classe è:
I metodi statici non sanno nulla della classe, trattano solo i parametri
I metodi di classe vengono usati insieme alla classe, perché il loro parametro è sempre il tipo stesso.
I metodi di classe possono essere chiamati sia dalla classe che dagli oggetti della classe.
Class.classmethod() O anche Class().classmethod()
Ma in ogni caso, il metodo di classe è sempre aggiunto al tipo che ha come primo parametro, perché il tipo stesso ècls.
def classMethod(cls, args...)
class Person: age = 25 def printAge(cls): print('l'età è:', cls.age) # creare il metodo di classe printAge Person.printAge = classmethod(Person.printAge) Person.printAge()
Quando si esegue il programma, l'output è:
l'età è: 25
Qui, abbiamo una classe Person, le cui variabili di membro sonoetàè stato specificato come 25.
Abbiamo ancora una funzione printAge, che accetta solo un parametro cls, invece del self che usiamo di solito.
clsAccetta come parametro la classe Person, non l'oggetto / esempio Person.
Ora, passiamo il metodo Person.printAge come parametro a questa funzione classmethod. Questo trasformerà il metodo in un metodo di classe, così accetta il primo parametro come classe (cioè Person).
Nella riga finale, chiamando printAge non crea l'oggetto Person come farebbe un metodo statico. Stampa la variabile di classeetà.
I metodi fabbrica sono quei metodi che restituiscono oggetti di classe (come costruttori) per diversi casi d'uso.
È simile al ricarico di funzione in C++. Poiché Python non ha questa funzionalità, vengono utilizzati metodi di classe e statici.
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()
Quando si esegue il programma, l'output è:
L'età di Adam è: 19 L'età di John è: 31
Qui, abbiamo due creatori di esempi di classe, un costruttore e un metodo fromBirthYear.
Il costruttore utilizza i parametri convenzionalinameeetà. Mentre fromBirthYear usacls,nameebirthYeare calcola l'età corrente sottraendo l'anno di nascita corrente dall'età, restituendo un esempio di classe.
Il metodo fromBirthYear prende Person classe (non l'oggetto Person) come primo parametrocls,e chiamando restituisce il costruttore cls(name, date.today().year - birthYear), che è equivalente a Person(name, date.today().year - birthYear)
Prima di questo metodo, vediamo @classmethod. Questo si chiamaDecoratore,Metodo di classe utilizzato per trasformare fromBirthYear in classmethod()
Ogni volta che si implementa un metodo fabbrica come metodo di classe per derivare una classe, può garantire che venga creato correttamente l'esempio della classe derivate.
Puoi creare un metodo statico per l'esempio sopra, ma l'oggetto creato sarà sempre硬编码 di Base classe.
Ma quando si utilizzano i metodi di classe, crea correttamente l'esempio della classe derivate.
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))
Quando si esegue il programma, l'output è:
True False
In questo caso, per creare un esempio di classe utilizzando un metodo statico, dobbiamo incodificare manualmente il tipo dell'esempio durante il processo di creazione.
Questo ovviamente causerebbe un problema quando Person eredita da Man.
Il metodo fromFathersAge non restituisce un oggetto Man, ma un oggetto della classe base Person.
Questo va contro il paradigma OOP. L'uso del metodo di classe fromBirthYear garantisce che il codice sia orientato agli oggetti, poiché il primo argomento è la classe stessa e chiama il suo metodo factory.