Metoda classmethod () vrací metodu třídy pro danou funkci.
Syntaxe classmethod()
metody je:
metoda třídy (funkce)
classmethod()
je považován za nepythonický, takže v novějších verzích Pythonu můžete použít @classmethod
dekorátor pro definici metody třídy.
Syntaxe je:
@classmethod def func (cls, args …)
classmethod () parametry
classmethod()
metoda má jeden parametr:
- function - Funkce, kterou je třeba převést na metodu třídy
Vrátit hodnotu z classmethod ()
classmethod()
metoda vrací metodu třídy pro danou funkci.
Co je to metoda třídy?
Metoda třídy je metoda, která je vázána spíše na třídu než na její objekt. Nevyžaduje vytvoření instance třídy, podobně jako staticmethod.
Rozdíl mezi statickou metodou a metodou třídy je:
- Statická metoda neví nic o třídě a zabývá se pouze parametry
- Metoda třídy pracuje s třídou, protože její parametr je vždy třída sama.
Metodu třídy lze volat jak třídou, tak jejím objektem.
Class.classmethod () Nebo dokonce Class (). Classmethod ()
Ale bez ohledu na to, metoda třídy je vždy připojena ke třídě s prvním argumentem, protože třída sama o sobě cls.
def classMethod (cls, args …)
Příklad 1: Vytvoření metody třídy pomocí 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ýstup
Věk je: 25
Tady máme třídu Person
, jejíž věk člena je přiřazen k 25.
Máme také funkci, printAge
která bere jeden parametr cls a ne self
obvykle.
cls přijímá třídu Person
jako parametr spíše než Personův objekt / instanci.
Nyní předáme metodu Person.printAge
jako argument funkci classmethod
. Tím se metoda převede na metodu třídy tak, aby přijímala první parametr jako třídu (tj. Osoba).
Na posledním řádku voláme printAge
bez vytvoření Person objektu, jako to děláme pro statické metody. Tím se vytiskne proměnný věk třídy.
Kdy používáte metodu třídy?
1. Tovární metody
Tovární metody jsou metody, které vracejí objekt třídy (jako konstruktor) pro různé případy použití.
Je to podobné jako přetížení funkce v C ++. Protože Python nemá nic jako takového, používají se třídní metody a statické metody.
Příklad 2: Vytvořte tovární metodu pomocí metody třídy
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ýstup
Adamův věk je: 19 Johnův věk je: 31
Tady máme dva tvůrce instancí třídy, konstruktor a fromBirthYear
metodu.
Konstruktor přebírá název a věk normálních parametrů. While, fromBirthYear
takes class, name and birthYear, spočítá aktuální věk odečtením od aktuálního roku a vrátí instanci třídy.
Metoda fromBirthYear bere Person třídu (ne Person objekt) jako první parametr cls a vrátí konstruktor voláním cls(name, date.today().year - birthYear)
, což je ekvivalentníPerson(name, date.today().year - birthYear)
Před metodou, vidíme @classmethod
. Tomu se říká dekorátor pro převod fromBirthYear
na metodu třídy jako classmethod()
.
2. Správné vytvoření instance v dědičnosti
Kdykoli odvozujete třídu z implementace tovární metody jako metody třídy, zajišťuje správné vytvoření instance odvozené třídy.
Pro výše uvedený příklad můžete vytvořit statickou metodu, ale objekt, který vytvoří, bude vždy pevně zakódován jako základní třída.
Ale když použijete metodu třídy, vytvoří správnou instanci odvozené třídy.
Příklad 3: Jak funguje třídní metoda pro dědictví?
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ýstup
True False
Tady, použití statické metody k vytvoření instance třídy chce, abychom během vytváření pevně zakódovali typ instance.
To zjevně způsobuje problém při dědění Person
na Man
.
fromFathersAge
metoda nevrací Man
objekt, ale objekt jeho základní třídy Person
.
To porušuje paradigma OOP. Použití metody třídy fromBirthYear
může zajistit OOP kódu, protože bere první parametr jako třídu sám a volá svou tovární metodu.