Metoda classmethod () vraća metodu klase za zadanu funkciju.
Sintaksa classmethod()
metode je:
classmethod (funkcija)
classmethod()
smatra se ne-Pythonic-om pa u novijim verzijama Pythona-a možete koristiti @classmethod
uređivač za definiciju classmethod-a.
Sintaksa je:
@classmethod def func (cls, args …)
classmethod () Parametri
classmethod()
metoda uzima jedan parametar:
- funkcija - funkcija koju treba pretvoriti u metodu klase
Vrati vrijednost iz classmethod ()
classmethod()
metoda vraća metodu klase za zadanu funkciju.
Što je razredna metoda?
Metoda klase je metoda koja je vezana za klasu, a ne za njezin objekt. Ne zahtijeva stvaranje instance klase, slično kao staticmethod.
Razlika između statičke metode i metode klase je:
- Statička metoda ne zna ništa o klasi i samo se bavi parametrima
- Metoda klase radi s klasom jer je njezin parametar uvijek sama klasa.
Metodu klase mogu pozvati i klasa i njezin objekt.
Class.classmethod () Ili čak Class (). Classmethod ()
Ali bez obzira na sve, metoda klase je uvijek pridružena klasi s prvim argumentom dok se klasa cls.
def classMethod (cls, args …)
Primjer 1: Stvorite metodu klase pomoću 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()
Izlaz
Dob je: 25
Ovdje imamo razred Person
s promjenjivom dobi člana koja je dodijeljena na 25 godina.
Također imamo funkciju printAge
koja uzima jedan parametar cls, a ne self
obično.
cls prihvaća klasu Person
kao parametar, a ne kao objekt / instancu osobe.
Sada prosljeđujemo metodu Person.printAge
kao argument funkciji classmethod
. To pretvara metodu u metodu klase tako da prihvaća prvi parametar kao klasu (tj. Osoba).
U zadnjem retku zovemo printAge
bez stvaranja objekta Person kao što to činimo za statičke metode. Ovo ispisuje varijablu razreda.
Kada koristite nastavnu metodu?
1. Tvorničke metode
Tvorničke metode su one metode koje vraćaju objekt klase (poput konstruktora) za različite slučajeve upotrebe.
Slično je preopterećenju funkcija u C ++. Budući da Python nema ništa kao takvo, koriste se metode klase i statičke metode.
Primjer 2: Stvorite tvorničku metodu metodom klase
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()
Izlaz
Adamove godine su: 19 Ivanove godine su: 31
Ovdje imamo dva kreatora instance klase, konstruktor i fromBirthYear
metodu.
Konstruktor uzima normalne parametre ime i dob. Dok fromBirthYear
uzima razred, ime i godinu rođenja, izračunava trenutnu dob oduzimajući je od tekuće godine i vraća instancu razreda.
Metoda fromBirthYear uzima klasu Person (ne Person objekt) kao prvi parametar cls i vraća konstruktor pozivanjem cls(name, date.today().year - birthYear)
, što je ekvivalentnoPerson(name, date.today().year - birthYear)
Prije metode, vidimo @classmethod
. To se naziva dekorator za pretvaranje fromBirthYear
u metodu klase kao classmethod()
.
2. Ispravna izrada instance u nasljeđivanju
Kad god izvedete klasu iz implementacije tvorničke metode kao metode klase, ona osigurava ispravno stvaranje instance izvedene klase.
Za gornji primjer možete stvoriti statičku metodu, ali objekt koji on stvori uvijek će biti čvrsto kodiran kao osnovna klasa.
Ali, kada koristite metodu klase, ona stvara ispravnu instancu izvedene klase.
Primjer 3: Kako metoda klase radi za nasljeđivanje?
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))
Izlaz
Točno netočno
Ovdje upotreba statičke metode za stvaranje instance klase želi da tijekom izrade čvrsto kodiramo vrstu instance.
To očito stvara problem prilikom nasljeđivanja Person
na Man
.
fromFathersAge
metoda ne vraća Man
objekt već objekt osnovne klase Person
.
Ovo krši OOP paradigmu. Upotreba metode klase koja fromBirthYear
može osigurati OOP-ovu kod, jer uzima prvi parametar kao samu klasu i poziva svoju tvorničku metodu.