„Python“ klasės metodas ()

Metodas „classmethod ()“ pateikia nurodytos funkcijos klasės metodą.

classmethod()Metodo sintaksė yra:

 klasės metodas (funkcija)

classmethod()yra laikomas ne Pythonic, todėl naujesnėse Python versijose @classmethodklasikinio metodo apibrėžimui galite naudoti dekoratorių.

Sintaksė yra:

 @classmethod def func (cls, args…)

classmethod () Parametrai

classmethod() metodas apima vieną parametrą:

  • function - Funkcija, kurią reikia paversti klasės metodu

Grąžinimo vertė iš klasės metodo ()

classmethod() metodas grąžina nurodytos funkcijos klasės metodą.

Kas yra klasės metodas?

Klasės metodas yra metodas, susietas su klase, o ne su jos objektu. Tam nereikia sukurti klasės egzemplioriaus, panašiai kaip staticmethod.

Statinio metodo ir klasės metodo skirtumas yra toks:

  • Statinis metodas nieko nežino apie klasę ir tik nagrinėja parametrus
  • Klasės metodas veikia su klase, nes jo parametras visada yra pati klasė.

Klasės metodą gali vadinti klasė ir jos objektas.

 Class.classmethod () Arba net Class (). Classmethod ()

Bet nesvarbu, klasės metodas visada pridedamas prie klasės su pirmu argumentu, nes pati klasė laikosi.

 def classMethod (cls, args …)

1 pavyzdys: kurkite klasės metodą naudodami 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()

Rezultatas

 Amžius yra: 25 

Čia mes turime klasę Person, kurios narys gali kisti nuo 25 metų.

Mes taip pat turime funkciją, printAgekuri paima vieną parametrą cls, o ne selfmes paprastai.

„cls“ priima klasę Personkaip parametrą, o ne asmens objektą / egzempliorių.

Dabar metodą Person.printAgekaip argumentą perduodame funkcijai classmethod. Tai konvertuoja metodą į klasės metodą taip, kad jis priima pirmąjį parametrą kaip klasę (ty asmenį).

Paskutinėje eilutėje mes skambiname printAgenekurdami objekto „Asmuo“, kaip tai darome statiniams metodams. Tai atspausdina klasės kintamą amžių.

Kada jūs naudojate klasės metodą?

1. Gamyklos metodai

Gamykliniai metodai yra tie metodai, kurie grąžina klasės objektą (pvz., Konstruktorių) skirtingiems naudojimo atvejams.

Tai panašu į funkcijų perkrovą C ++. Kadangi „Python“ nieko tokio neturi, naudojami klasių metodai ir statiniai metodai.

2 pavyzdys: sukurkite gamyklos metodą naudodami klasės metodą

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

Rezultatas

 Adomo amžius: 19 Jono amžius: 31 

Čia mes turime du klasės egzempliorių kūrėjus, konstruktorius ir fromBirthYearmetodą.

Konstruktorius paima normalių parametrų pavadinimą ir amžių. Nors, fromBirthYearima klasę, vardą ir gimimo metus, apskaičiuoja dabartinį amžių atimdamas jį iš einamųjų metų ir grąžina klasės egzempliorių.

„FromBirthYear“ metodas ima „Person“ klasę (ne „Person objektą“) kaip pirmąjį parametrą cls ir grąžina konstruktorių iškviesdamas cls(name, date.today().year - birthYear), o tai yraPerson(name, date.today().year - birthYear)

Prieš metodą matome @classmethod. Tai vadinama dekoratoriumi, norint konvertuoti fromBirthYearį klasės metodą kaip classmethod().

2. Teisingas egzemplioriaus kūrimas paveldėjime

Kaskart, kai klasę gaunate iš gamyklos metodo kaip klasės metodo, tai užtikrina teisingą išvestinės klasės egzempliorių sukūrimą.

Aukščiau pateiktam pavyzdžiui galite sukurti statinį metodą, tačiau jo sukurtas objektas visada bus užkoduotas kaip „Base“ klasė.

Bet kai naudojate klasės metodą, jis sukuria teisingą išvestinės klasės egzempliorių.

3 pavyzdys: Kaip klasės metodas veikia paveldint?

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

Rezultatas

 Tiesa Netiesa 

Naudojant statinį metodą kuriant klasės egzempliorių, norime, kad kurdami egzempliorių tipą užkoduotume.

Tai aiškiai sukelia problemų, kai paveldi Personį Man.

fromFathersAgemetodas negrąžina Manobjekto, o jo pagrindinės klasės Personobjekto.

Tai pažeidžia OOP paradigmą. Naudojant klasės metodą, fromBirthYeargalima užtikrinti kodo OOP nebuvimą, nes jis paima pirmąjį parametrą kaip pačią klasę ir iškviečia savo gamyklos metodą.

Įdomios straipsniai...