Metóda triedy Python ()

Metóda classmethod () vracia metódu triedy pre danú funkciu.

Syntax classmethod()metódy je:

 triedna metóda (funkcia)

classmethod()je považovaný za nepytonický, takže v novších verziách Pythonu môžete @classmethodna definíciu triednej metódy použiť dekorátor.

Syntax je:

 @classmethod def func (cls, args …)

classmethod () parametre

classmethod() metóda má jediný parameter:

  • function - Funkcia, ktorú je potrebné previesť na metódu triedy

Návratová hodnota z classmethod ()

classmethod() metóda vráti metódu triedy pre danú funkciu.

Čo je to triedna metóda?

Metóda triedy je metóda, ktorá je viazaná na triedu a nie na jej objekt. Nevyžaduje vytvorenie inštancie triedy, podobne ako staticmethod.

Rozdiel medzi statickou metódou a metódou triedy je:

  • Statická metóda nevie nič o triede a zaoberá sa iba parametrami
  • Metóda triedy pracuje s triedou, pretože jej parametrom je vždy samotná trieda.

Metóda triedy môže byť volaná ako triedou, tak aj jej objektom.

 Class.classmethod () alebo dokonca Class (). Classmethod ()

Ale bez ohľadu na to, metóda triedy je vždy pripojená k triede s prvým argumentom, pretože trieda samotná cls.

 def classMethod (cls, args …)

Príklad 1: Vytvorenie metódy triedy pomocou 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()

Výkon

 Vek je: 25 

Máme triedu Persons vekom člena premenným na 25 rokov.

Máme tiež funkciu, printAgektorá zaberá jeden parameter cls, a nie selfmy, ktorú zvyčajne berieme.

cls akceptuje triedu Personskôr ako parameter ako objekt / inštanciu osoby.

Teraz odovzdáme metódu Person.printAgeako argument funkcii classmethod. Týmto sa metóda prevedie na metódu triedy, aby prijala prvý parameter ako triedu (tj. Osoba).

V poslednom riadku voláme printAgebez vytvorenia objektu Person, ako to robíme pre statické metódy. Týmto sa vytlačí premenný vek triedy.

Kedy použijete triednu metódu?

1. Továrenské metódy

Továrenské metódy sú tie metódy, ktoré vracajú objekt triedy (napríklad konštruktor) pre rôzne prípady použitia.

Je to podobné ako preťaženie funkcií v C ++. Pretože Python nemá nič také, používajú sa triedne metódy a statické metódy.

Príklad 2: Vytvorenie továrenskej metódy pomocou metódy triedy

 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ýkon

 Vek Adama je: 19 Vek Johna: 31 

Máme dvoch tvorcov inštancií triedy, konštruktor a fromBirthYearmetódu.

Konštruktor vezme normálny názov parametra a vek. While, fromBirthYeartakes class, name and birthYear, spočítava aktuálny vek jeho odpočítaním od aktuálneho roku a vráti inštanciu triedy.

Metóda fromBirthYear berie triedu Person (nie Person objekt) ako prvý parameter cls a vráti konštruktor volaním cls(name, date.today().year - birthYear), čo je ekvivalentné sPerson(name, date.today().year - birthYear)

Pred metódou, uvidíme @classmethod. Toto sa nazýva dekorátor na prevod fromBirthYearna triednu metódu ako classmethod().

2. Správne vytvorenie inštancie v dedičstve

Kedykoľvek odvodíte triedu od implementácie továrenskej metódy ako metódy triedy, zabezpečí to správne vytvorenie inštancie odvodenej triedy.

Pre vyššie uvedený príklad môžete vytvoriť statickú metódu, ale objekt, ktorý vytvorí, bude vždy napevno zakódovaný ako základná trieda.

Keď ale použijete metódu triedy, vytvorí sa správna inštancia odvodenej triedy.

Príklad 3: Ako funguje triedna metóda pre dedičstvo?

 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ýkon

 Pravda lož 

Tu pomocou statickej metódy na vytvorenie inštancie triedy chceme, aby sme typ inštancie počas vytvárania napevno zakódovali.

Toto zjavne spôsobuje problém pri dedení Personna Man.

fromFathersAgemetóda nevracia Manobjekt, ale objekt jeho základnej triedy Person.

To porušuje paradigmu OOP. Použitie metódy triedy fromBirthYearmôže zabezpečiť OOP kódu, pretože prvý parameter berie ako triedu sám a volá svoju továrenskú metódu.

Zaujímavé články...