Metoda clasei Python ()

Metoda classmethod () returnează o metodă de clasă pentru funcția dată.

Sintaxa classmethod()metodei este:

 metodă de clasă (funcție)

classmethod()este considerat un-Pythonic, deci în versiunile Python mai noi, puteți utiliza @classmethoddecoratorul pentru definirea metodei de clasă.

Sintaxa este:

 @classmethod def func (cls, args …)

classmethod () Parametri

classmethod() metoda ia un singur parametru:

  • funcție - Funcție care trebuie convertită într-o metodă de clasă

Returnează valoarea din classmethod ()

classmethod() metoda returnează o metodă de clasă pentru funcția dată.

Ce este o metodă de clasă?

O metodă de clasă este o metodă care este legată mai degrabă de o clasă decât de obiectul acesteia. Nu necesită crearea unei instanțe de clasă, la fel ca metoda statică.

Diferența dintre o metodă statică și o metodă de clasă este:

  • Metoda statică nu știe nimic despre clasă și se ocupă doar de parametri
  • Metoda clasei funcționează cu clasa, deoarece parametrul său este întotdeauna clasa în sine.

Metoda clasei poate fi numită atât de clasă, cât și de obiectul acesteia.

 Class.classmethod () Sau chiar Class (). Classmethod ()

Dar, indiferent de ce, metoda clasei este întotdeauna atașată unei clase cu primul argument pe măsură ce clasa însăși cls.

 def classMethod (cls, args …)

Exemplul 1: Creați metoda clasei folosind 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()

Ieșire

 Vârsta este: 25 

Aici avem o clasă Person, cu o vârstă variabilă de membru atribuită la 25.

De asemenea, avem o funcție printAgecare ia un singur parametru cls și nu selfluăm de obicei.

cls acceptă clasa Personca parametru și nu ca obiect / instanță a persoanei.

Acum, trecem metoda Person.printAgeca argument către funcție classmethod. Aceasta convertește metoda într-o metodă de clasă, astfel încât să accepte primul parametru ca o clasă (adică Persoană).

În linia finală, apelăm printAgefără a crea un obiect Persoană, așa cum facem pentru metodele statice. Aceasta imprimă vârsta variabilă a clasei.

Când folosiți metoda clasei?

1. Metode din fabrică

Metodele din fabrică sunt acele metode care returnează un obiect de clasă (cum ar fi constructorul) pentru diferite cazuri de utilizare.

Este similar cu supraîncărcarea funcției în C ++. Deoarece Python nu are nimic ca atare, sunt folosite metode de clasă și metode statice.

Exemplul 2: Creați o metodă din fabrică utilizând metoda clasei

 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()

Ieșire

 Vârsta lui Adam este: 19 Vârsta lui Ioan este: 31 

Aici, avem doi creatori de instanțe de clasă, un constructor și o fromBirthYearmetodă.

Constructorul ia parametrii normali numele și vârsta. În timp ce, fromBirthYearia clasa, numele și birthYear, calculează vârsta curentă scăzând-o cu anul curent și returnează instanța clasei.

Metoda fromBirthYear ia clasa Person (nu obiectul Person) ca primul parametru cls și returnează constructorul apelând cls(name, date.today().year - birthYear), care este echivalent cuPerson(name, date.today().year - birthYear)

Înainte de metodă, vedem @classmethod. Aceasta se numește un decorator pentru transformarea fromBirthYearîntr - o metodă de clasă ca classmethod().

2. Crearea corectă a instanței în moștenire

Ori de câte ori obțineți o clasă din implementarea unei metode fabrică ca metodă de clasă, aceasta asigură crearea corectă a instanței clasei derivate.

Puteți crea o metodă statică pentru exemplul de mai sus, dar obiectul pe care îl creează va fi întotdeauna codat ca clasă de bază.

Dar, atunci când utilizați o metodă de clasă, aceasta creează instanța corectă a clasei derivate.

Exemplul 3: Cum funcționează metoda clasei pentru moștenire?

 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))

Ieșire

 Adevarat fals 

Aici, folosirea unei metode statice pentru a crea o instanță de clasă dorește să codificăm tipul instanței în timpul creării.

Acest lucru cauzează în mod clar o problemă atunci când moșteniți Personla Man.

fromFathersAgemetoda nu returnează un Manobiect, ci obiectul clasei sale de bază Person.

Acest lucru încalcă paradigma OOP. Folosind o metodă de clasă care fromBirthYearpoate asigura caracterul OOP al codului, deoarece acesta ia primul parametru ca clasă în sine și apelează metoda sa din fabrică.

Articole interesante...