Python classmethod ()

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 @classmethoduređ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 Persons promjenjivom dobi člana koja je dodijeljena na 25 godina.

Također imamo funkciju printAgekoja uzima jedan parametar cls, a ne selfobično.

cls prihvaća klasu Personkao parametar, a ne kao objekt / instancu osobe.

Sada prosljeđujemo metodu Person.printAgekao argument funkciji classmethod. To pretvara metodu u metodu klase tako da prihvaća prvi parametar kao klasu (tj. Osoba).

U zadnjem retku zovemo printAgebez 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 fromBirthYearmetodu.

Konstruktor uzima normalne parametre ime i dob. Dok fromBirthYearuzima 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 fromBirthYearu 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 Personna Man.

fromFathersAgemetoda ne vraća Manobjekt već objekt osnovne klase Person.

Ovo krši OOP paradigmu. Upotreba metode klase koja fromBirthYearmože osigurati OOP-ovu kod, jer uzima prvi parametar kao samu klasu i poziva svoju tvorničku metodu.

Zanimljivi članci...