Metoda classmethod () vrne metodo razreda za dano funkcijo.
Sintaksa classmethod()
metode je:
classmethod (funkcija)
classmethod()
se šteje za ne-Pythonic, zato lahko v novejših različicah Pythona @classmethod
dekorater uporabite za definicijo classmethod.
Sintaksa je:
@classmethod def func (cls, args …)
parametri classmethod ()
classmethod()
metoda vzame en parameter:
- funkcija - funkcija, ki jo je treba pretvoriti v metodo razreda
Vrnjena vrednost iz classmethod ()
classmethod()
metoda vrne metodo razreda za dano funkcijo.
Kaj je razredna metoda?
Metoda razreda je metoda, ki je vezana na razred in ne na njegov objekt. Ne zahteva ustvarjanja primerka razreda, podobno kot staticmethod.
Razlika med statično metodo in metodo razreda je:
- Statična metoda o razredu ne ve ničesar in se ukvarja samo s parametri
- Metoda razreda deluje z razredom, saj je njegov parameter vedno razred sam.
Metodo razreda lahko prikliče tako razred kot njegov objekt.
Class.classmethod () Ali celo Class (). Classmethod ()
A ne glede na vse, je metoda razreda vedno pripeta na razred s prvim argumentom, saj se razred sam cls.
def classMethod (cls, args …)
Primer 1: Ustvari metodo razreda z uporabo 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()
Izhod
Starost je: 25 let
Tu imamo razred Person
s spremenljivo starostjo člana, določeno za 25 let.
Imamo tudi funkcijo, printAge
ki zavzame en parameter cls in je self
običajno ne.
cls sprejema razred Person
kot parameter in ne osebni objekt / primerek.
Zdaj funkcijo prenesemo Person.printAge
kot argument kot argument classmethod
. S tem se metoda pretvori v metodo razreda, tako da sprejme prvi parameter kot razred (tj. Oseba).
V zadnji vrstici pokličemo, printAge
ne da bi ustvarili objekt Person, kot to počnemo pri statičnih metodah. S tem se natisne spremenljivka razreda.
Kdaj uporabljate razredno metodo?
1. Tovarniške metode
Tovarniške metode so tiste metode, ki vrnejo objekt razreda (na primer konstruktor) za različne primere uporabe.
Podobno je preobremenitvi funkcij v C ++. Ker Python nima ničesar takega, se uporabljajo metode razredov in statične metode.
Primer 2: Ustvari tovarniško metodo z uporabo metode razreda
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()
Izhod
Adamova starost je: 19 Janezova starost je: 31 let
Tu imamo dva razredna ustvarjalnika primerkov, konstruktor in fromBirthYear
metodo.
Konstruktor vzame normalno ime in starost parametrov. While, fromBirthYear
vzame razred, ime in leto rojstva, izračuna trenutno starost tako, da jo odšteje od tekočega leta in vrne primerek razreda.
Metoda fromBirthYear za prvi parameter cls vzame razred Person (ne objekt Person) in s klicem vrne konstruktor cls(name, date.today().year - birthYear)
, kar je enakovrednoPerson(name, date.today().year - birthYear)
Pred metodo vidimo @classmethod
. To se imenuje dekorater za pretvorbo fromBirthYear
v metodo razreda kot classmethod()
.
2. Pravilno ustvarjanje primerka pri dedovanju
Kadar koli razred izpeljete iz izvajanja tovarniške metode kot metode razreda, to zagotovi pravilno izdelavo primerka izpeljanega razreda.
Za zgornji primer lahko ustvarite statično metodo, toda objekt, ki ga ustvari, bo vedno trdo kodiran kot osnovni razred.
Ko pa uporabite metodo razreda, ustvari pravi primerek izpeljanega razreda.
Primer 3: Kako deluje metoda razreda za dedovanje?
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))
Izhod
Pravilno napačno
Tukaj uporaba statične metode za ustvarjanje primerka razreda želi, da med ustvarjanjem trdno kodiramo vrsto primerka.
To očitno povzroča težave pri dedovanju Person
do Man
.
fromFathersAge
metoda ne vrne Man
predmeta, ampak predmet osnovnega razreda Person
.
To krši paradigmo OOP. Uporaba metode razreda, ki fromBirthYear
lahko zagotovi OOP-nost kode, saj vzame prvi parameter kot razred sam in pokliče svojo tovarniško metodo.