Meetod classmethod () tagastab antud funktsiooni klassimeetodi.
Meetodi süntaks classmethod()
on:
klassi meetod (funktsioon)
classmethod()
peetakse Pythoni keeleks, nii et uuemates Pythoni versioonides saate @classmethod
klassimeetodi määratlemiseks kasutada dekoraatorit.
Süntaks on:
@classmethod def func (cls, args …)
classmethod () parameetrid
classmethod()
meetod võtab ühe parameetri:
- function - funktsioon, mis tuleb teisendada klassimeetodiks
Tagastusväärtus klassimeetodist ()
classmethod()
meetod tagastab antud funktsiooni klassi meetodi.
Mis on klassi meetod?
Klassimeetod on meetod, mis on seotud pigem klassi kui selle objektiga. See ei nõua klassieksemplari loomist, umbes nagu staatiline meetod.
Staatilise meetodi ja klassimeetodi erinevus on järgmine:
- Staatiline meetod ei tea klassist midagi ja tegeleb lihtsalt parameetritega
- Klassimeetod töötab klassiga, kuna selle parameeter on alati klass ise.
Klassi meetodit saab kutsuda nii klassi kui ka selle objekti järgi.
Class.classmethod () või isegi Class (). Classmethod ()
Kuid olenemata sellest, on klassi meetod alati esimese argumendiga klassi lisatud, kuna klass ise cls.
def classMethod (cls, args …)
Näide 1: klassimeetodi () abil klassimeetodi loomine
class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()
Väljund
Vanus on: 25
Siin on meil klass Person
, mille liikme vanuseks määratakse 25.
Meil on ka funktsioon, printAge
mis võtab ühe parameetri cls, mitte self
me tavaliselt.
cls aktsepteerib klassi Person
parameetrina, mitte isiku objektina / eksemplarina.
Nüüd edastame meetodi Person.printAge
argumendina funktsioonile classmethod
. See teisendab meetodi klassimeetodiks, nii et see aktsepteerib esimese parameetri klassina (st isik).
Viimases reas helistame printAge
isiklikku objekti loomata nagu staatiliste meetodite puhul. See prindib klassi muutuva vanuse.
Millal kasutate klassi meetodit?
1. Tehase meetodid
Tehasemeetodid on meetodid, mis tagastavad klassiobjekti (näiteks konstruktori) erinevate kasutusjuhtumite jaoks.
See sarnaneb funktsiooni ülekoormusega C ++. Kuna Pythonis pole midagi sellist, kasutatakse klassimeetodeid ja staatilisi meetodeid.
Näide 2: tehase meetodi loomine klassi meetodi abil
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()
Väljund
Aadama vanus on: 19 Johannese vanus: 31
Siin on meil kaks klassieksemplari loojat, konstruktor ja fromBirthYear
meetod.
Konstruktor võtab tavaliste parameetrite nime ja vanuse. Kuigi, fromBirthYear
võtab klassi, nime ja sünniaasta, arvutab praeguse vanuse lahutades selle jooksva aastaga ja tagastab klassieksemplari.
Meetod fromBirthYear võtab esimese parameetrina cls klassi Person (mitte objekti Person) ja tagastab kutsega konstruktori cls(name, date.today().year - birthYear)
, mis on samaväärnePerson(name, date.today().year - birthYear)
Enne meetodit näeme @classmethod
. Seda nimetatakse dekoraator ümberehitamiseks fromBirthYear
klassi meetodit nagu classmethod()
.
2. Õige eksemplari loomine pärimisel
Alati, kui tuletate klassi tehase meetodi kui klassimeetodi rakendamisest, tagab see tuletatud klassi õige eksemplari loomise.
Ülaltoodud näite jaoks saate luua staatilise meetodi, kuid selle loodud objekt kodeeritakse alati põhiklassina.
Kuid kui kasutate klassimeetodit, loob see tuletatud klassi õige eksemplari.
Näide 3: Kuidas klassimeetod pärandina töötab?
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))
Väljund
Õige Vale
Staatilise meetodi kasutamine klassi eksemplari loomiseks soovib siin, et me loomise ajal kodeeriksime eksemplari tüübi.
See on selgelt põhjustab probleeme, kui pärib Person
, et Man
.
fromFathersAge
meetod ei tagasta Man
objekti, vaid selle põhiklassi Person
objekti.
See rikub OOP paradigmat. Klassimeetodi kasutamine fromBirthYear
võib tagada koodi OOP-vajaduse, kuna see võtab esimese parameetri klassiks ise ja kutsub selle tehasemeetodi.