Metoda třídy Python ()

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 @classmethoddekorá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, printAgekterá bere jeden parametr cls a ne selfobvykle.

cls přijímá třídu Personjako parametr spíše než Personův objekt / instanci.

Nyní předáme metodu Person.printAgejako 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 printAgebez 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 fromBirthYearmetodu.

Konstruktor přebírá název a věk normálních parametrů. While, fromBirthYeartakes 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 fromBirthYearna 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í Personna Man.

fromFathersAgemetoda nevrací Manobjekt, ale objekt jeho základní třídy Person.

To porušuje paradigma OOP. Použití metody třídy fromBirthYearmůže zajistit OOP kódu, protože bere první parametr jako třídu sám a volá svou tovární metodu.

Zajímavé články...