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 @classmethod
na 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 Person
s vekom člena premenným na 25 rokov.
Máme tiež funkciu, printAge
ktorá zaberá jeden parameter cls, a nie self
my, ktorú zvyčajne berieme.
cls akceptuje triedu Person
skôr ako parameter ako objekt / inštanciu osoby.
Teraz odovzdáme metódu Person.printAge
ako 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 printAge
bez 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 fromBirthYear
metódu.
Konštruktor vezme normálny názov parametra a vek. While, fromBirthYear
takes 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 fromBirthYear
na 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í Person
na Man
.
fromFathersAge
metóda nevracia Man
objekt, ale objekt jeho základnej triedy Person
.
To porušuje paradigmu OOP. Použitie metódy triedy fromBirthYear
môže zabezpečiť OOP kódu, pretože prvý parameter berie ako triedu sám a volá svoju továrenskú metódu.