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ää @classmethod
sisustajaa 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, printAge
joka ottaa yhden parametrin cls, self
emmekä yleensä ota.
cls hyväksyy luokan Person
parametrina pikemminkin kuin henkilön esine / esiintymä.
Nyt välitämme menetelmän Person.printAge
argumentiksi funktiolle classmethod
. Tämä muuntaa menetelmän luokkamenetelmäksi siten, että se hyväksyy ensimmäisen parametrin luokkana (ts. Henkilö).
Viimeisessä rivissä soitamme printAge
luomatta 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 fromBirthYear
menetelmä.
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 Person
kohteeseen Man
.
fromFathersAge
method ei palauta Man
objektia, vaan sen perusluokan Person
objektia.
Tämä rikkoo OOP-paradigmaa. Luokkamenetelmän käyttäminen fromBirthYear
voi varmistaa koodin OOP-arvon, koska se ottaa ensimmäisen parametrin luokkaan itse ja kutsuu sen tehdasmenetelmää.