logo

classmethod() v Pythonu

The classmethod() je vestavěná funkce v Pythonu, která vrací metodu třídy pro danou funkci.

classmethod() v syntaxi Pythonu

Syntax: classmethod(funkce)

Parametr : Tato funkce přijímá název funkce jako parametr.



Typ vrácení: Tato funkce vrací metodu převedené třídy.

Funkce classmethod() v Pythonu

Metody classmethod() jsou vázány spíše na třídu než na objekt. Metody třídy mohou být volány třídou i objektem. Tyto metody lze volat s třídou nebo s objektem.

Metoda třídy vs statická metoda

Základní rozdíl mezi metoda třídy vs statická metoda v Pythonu a kdy použít metodu třídy a statickou metodu v Krajta .

  • Metoda třídy bere cls jako první parametr, zatímco statická metoda nepotřebuje žádné specifické parametry.
  • Metoda třídy může přistupovat ke stavu třídy nebo jej upravovat, zatímco statická metoda k němu nemůže přistupovat ani jej upravovat.
  • Obecně platí, že statické metody nevědí nic o stavu třídy. Jsou to metody obslužného typu, které přebírají některé parametry a pracují na těchto parametrech. Na druhou stranu metody třídy musí mít jako parametr třídu.
  • K vytvoření metody třídy používáme @classmethod decorator v Pythonu a @staticmethod decorator používáme k vytvoření statické metody v Pythonu.

Příklad classmethod v Pythonu

Vytvořte jednoduchou metodu třídy

V tomto příkladu uvidíme, jak vytvořit metodu třídy v Pythonu. Za tímto účelem jsme vytvořili třídu s názvem Geeks s kurzem členské proměnné a vytvořili funkci nazvanou nákup, která objekt vytiskne. Nyní jsme prošli metodouGeeks.purchase>do metody třídy pomocí@classmethod>decorator, který převádí metodu na metodu třídy. Se zavedenou metodou třídy můžeme zavolat nákup funkce bez vytvoření funkčního objektu přímo pomocí názvu třídy Geeks.

Python3




class> geeks:> >course>=> 'DSA'> >def> purchase(obj):> >print>(>'Purchase course : '>, obj.course)> geeks.purchase>=> classmethod>(geeks.purchase)> geeks.purchase()>

>

>

Výstup

Purchase course : DSA>

Vytvořte metodu třídy pomocí classmethod()

Před vytvořením tohoto řádku byla vytvořena metoda print_name classmethod print_name() Lze ji volat pouze s objektem, nikoli s třídou, nyní lze tuto metodu volat jako classmethod metoda print_name() se nazývá metoda třídy.

nastavení internetového prohlížeče

Python3




class> Student:> ># create a variable> >name>=> 'Geeksforgeeks'> ># create a function> >def> print_name(obj):> >print>(>'The name is : '>, obj.name)> # create print_name classmethod> # before creating this line print_name()> # It can be called only with object not with class> Student.print_name>=> classmethod>(Student.print_name)> # now this method can be called as classmethod> # print_name() method is called a class method> Student.print_name()>

>

>

Výstup

metoda podřetězce java
The name is : Geeksforgeeks>

Tovární metoda využívající metodu třídy

Použití funkce classmethod() se používá v továrních návrhových vzorech, kde chceme volat mnoho funkcí s názvem třídy spíše než s objektem.

Python3




# Python program to demonstrate> # use of a class method and static method.> from> datetime>import> date> class> Person:> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> ># a class method to create a> ># Person object by birth year.> >@classmethod> >def> fromBirthYear(>cls>, name, year):> >return> cls>(name, date.today().year>-> year)> >def> display(>self>):> >print>(>'Name : '>,>self>.name,>'Age : '>,>self>.age)> person>=> Person(>'mayank'>,>21>)> person.display()>

>

>

Výstup

Name : mayank Age : 21>

Jak metoda třídy funguje pro dědičnost?

V tomto příkladu vytváříme hierarchii tříd Pythonu se dvěma třídami,Person>aMan>a demonstruje použití metod třídy a dědičnosti.

Python3




from> datetime>import> date> # random Person> class> Person:> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >@staticmethod> >def> from_FathersAge(name, fatherAge, fatherPersonAgeDiff):> >return> Person(name, date.today().year>-> fatherAge>+> fatherPersonAgeDiff)> >@classmethod> >def> from_BirthYear(>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>=> 'Female'> man>=> Man.from_BirthYear(>'John'>,>1985>)> print>(>isinstance>(man, Man))> man1>=> Man.from_FathersAge(>'John'>,>1965>,>20>)> print>(>isinstance>(man1, Man))>

>

>

Výstup

True False>

Python @classmethod Decorator

Dekorátor @classmethod je vestavěný funkční dekoratér což je výraz, který se vyhodnotí poté, co je vaše funkce definována. Výsledek tohoto vyhodnocení zastíní vaši definici funkce. Metoda třídy přijímá třídu jako implicitní první argument, stejně jako metoda instance přijímá instanci.

Syntaxe classmethod Decorator

třída C(objekt):

@třídní metoda

def fun(cls, arg1, arg2, …):

….

Kde,

C
  • zábava: funkce, kterou je třeba převést na metodu třídy
  • vrací: metoda třídy pro funkci.

Poznámka:

  • Metoda třídy je metoda, která je vázána na třídu a ne na objekt třídy.
  • Mají přístup ke stavu třídy, protože vyžaduje parametr třídy, který ukazuje na třídu a ne na instanci objektu.
  • Může upravit stav třídy, který by se vztahoval na všechny instance třídy. Může například upravit proměnnou třídy, která by byla použitelná pro všechny instance.

Příklad

V níže uvedeném příkladu používáme staticmethod() a classmethod() ke kontrole, zda je osoba dospělá nebo ne.

Python3




# Python program to demonstrate> # use of a class method and static method.> from> datetime>import> date> class> Person:> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> ># a class method to create a> ># Person object by birth year.> >@classmethod> >def> fromBirthYear(>cls>, name, year):> >return> cls>(name, date.today().year>-> year)> ># a static method to check if a> ># Person is adult or not.> >@staticmethod> >def> isAdult(age):> >return> age>>18> person1>=> Person(>'mayank'>,>21>)> person2>=> Person.fromBirthYear(>'mayank'>,>1996>)> print>(person1.age)> print>(person2.age)> # print the result> print>(Person.isAdult(>22>))>

>

>

Výstup

21 27 True>