Python-luokan menetelmä ()

Classmethod () -menetelmä palauttaa luokkamenetelmän annetulle funktiolle.

Menetelmän syntaksi classmethod()on:

 luokan menetelmä (toiminto)

classmethod()pidetään epä Pythonicina, joten uudemmissa Python-versioissa voit käyttää @classmethodsisustajaa luokkamenetelmän määrittelyyn.

Syntaksi on:

 @classmethod def func (cls, args…)

classmethod () -parametrit

classmethod() menetelmä ottaa yhden parametrin:

  • function - Funktio, joka on muunnettava luokkamenetelmäksi

Palautusarvo luokkamenetelmästä ()

classmethod() method palauttaa luokkamenetelmän annetulle funktiolle.

Mikä on luokan menetelmä?

Luokkamenetelmä on menetelmä, joka on sidottu luokkaan sen objektin sijaan. Se ei vaadi luokan esiintymän luomista, aivan kuten staattinen menetelmä.

Staattisen menetelmän ja luokan menetelmän ero on:

  • Staattinen menetelmä ei tiedä mitään luokasta ja käsittelee vain parametreja
  • Luokkamenetelmä toimii luokan kanssa, koska sen parametri on aina luokka itse.

Luokkamenetelmää voidaan kutsua sekä luokassa että sen objektissa.

 Class.classmethod () Tai jopa Class (). Classmethod ()

Mutta ei väliä mitä, luokan menetelmä liitetään aina luokkaan ensimmäisen argumentin kanssa, kun luokka itse cls.

 def classMethod (cls, args …)

Esimerkki 1: Luo luokan menetelmä käyttämällä 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()

Tuotos

 Ikä on: 25 

Täällä meillä on luokka Person, jossa jäsenen vaihtuva ikä on 25.

Meillä on myös toiminto, printAgejoka ottaa yhden parametrin cls, selfemmekä yleensä ota.

cls hyväksyy luokan Personparametrina pikemminkin kuin henkilön esine / esiintymä.

Nyt välitämme menetelmän Person.printAgeargumentiksi funktiolle classmethod. Tämä muuntaa menetelmän luokkamenetelmäksi siten, että se hyväksyy ensimmäisen parametrin luokkana (ts. Henkilö).

Viimeisessä rivissä soitamme printAgeluomatta Person-objektia, kuten staattisille menetelmille. Tämä tulostaa luokan vaihtelevan iän.

Milloin käytät luokan menetelmää?

1. Tehtaan menetelmät

Tehdasmenetelmät ovat menetelmiä, jotka palauttavat luokan objektin (kuten konstruktorin) eri käyttötapauksiin.

Se on samanlainen kuin toimintojen ylikuormitus C ++: ssa. Koska Pythonilla ei ole mitään sellaisenaan, käytetään luokkamenetelmiä ja staattisia menetelmiä.

Esimerkki 2: Luo tehdasmenetelmä luokan menetelmällä

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

Tuotos

 Aadamin ikä on: 19 Johanneksen ikä on: 31 

Täällä meillä on kaksi luokan ilmentymien luojaa, konstruktori ja fromBirthYearmenetelmä.

The constructor takes normal parameters name and age. While, fromBirthYear takes class, name and birthYear, calculates the current age by subtracting it with the current year and returns the class instance.

The fromBirthYear method takes Person class (not Person object) as the first parameter cls and returns the constructor by calling cls(name, date.today().year - birthYear), which is equivalent to Person(name, date.today().year - birthYear)

Before the method, we see @classmethod. This is called a decorator for converting fromBirthYear to a class method as classmethod().

2. Correct instance creation in inheritance

Whenever you derive a class from implementing a factory method as a class method, it ensures correct instance creation of the derived class.

You can create a static method for the above example but the object it creates, will always be hardcoded as Base class.

Mutta kun käytät luokan menetelmää, se luo johdetun luokan oikean esiintymän.

Esimerkki 3: Kuinka luokkamenetelmä toimii perinnössä?

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

Tuotos

 Tosi väärä 

Staattisen menetelmän käyttäminen luokan ilmentymän luomiseen haluaa tässä, että koodaamme ilmentymän tyypin luomisen aikana.

Tämä selvästi aiheuttaa ongelmia, kun perivät Personkohteeseen Man.

fromFathersAgemethod ei palauta Manobjektia, vaan sen perusluokan Personobjektia.

Tämä rikkoo OOP-paradigmaa. Luokkamenetelmän käyttäminen fromBirthYearvoi varmistaa koodin OOP-arvon, koska se ottaa ensimmäisen parametrin luokkaan itse ja kutsuu sen tehdasmenetelmää.

Mielenkiintoisia artikkeleita...