classmethod() v Pythone
The classmethod() je vstavaná funkcia v Pythone, ktorá vracia metódu triedy pre danú funkciu.
classmethod() v syntaxi Pythonu
Syntax: triedna metóda (funkcia)
Parameter: Táto funkcia akceptuje názov funkcie ako parameter.
Typ návratu: Táto funkcia vráti metódu konvertovanej triedy.
Funkcia Python classmethod()
Metódy classmethod() sú viazané skôr na triedu ako na objekt. Metódy triedy môžu byť volané triedou aj objektom. Tieto metódy možno volať s triedou alebo s objektom.
Metóda triedy vs statická metóda
Základný rozdiel medzi metóda triedy vs statická metóda v Pythone a kedy použiť metódu triedy a statickú metódu v Python .
- Metóda triedy berie cls ako prvý parameter, zatiaľ čo statická metóda nepotrebuje žiadne špecifické parametre.
- Metóda triedy môže pristupovať alebo upravovať stav triedy, zatiaľ čo statická metóda k nemu nemôže pristupovať ani ho upravovať.
- Vo všeobecnosti statické metódy nevedia nič o stave triedy. Sú to metódy pomocného typu, ktoré berú niektoré parametre a pracujú na týchto parametroch. Na druhej strane metódy triedy musia mať triedu ako parameter.
- Na vytvorenie metódy triedy používame @classmethod decorator v Pythone a na vytvorenie statickej metódy v Pythone používame @staticmethod decorator.
Príklad triednej metódy v Pythone
Vytvorte jednoduchú triednu metódu
V tomto príklade uvidíme, ako vytvoriť metódu triedy v Pythone. Na tento účel sme vytvorili triedu Geeks s členskou premennou kurz a vytvorili funkciu s názvom nákup, ktorá vytlačí objekt. Teraz sme prešli metódou Geeks.purchase> do metódy triedy pomocou @classmethod> dekorátor, ktorý konvertuje metódu na metódu triedy. So zavedenou metódou triedy môžeme zavolať nákup funkcie bez vytvorenia funkčného objektu priamo pomocou názvu triedy Geeks.
Python3
class> geeks:> > course> => 'DSA'> > def> purchase(obj):> > print> (> 'Purchase course : '> , obj.course)> geeks.purchase> => classmethod> (geeks.purchase)> geeks.purchase()> |
Výkon
Purchase course : DSA
Vytvorte metódu triedy pomocou classmethod()
Vytvorené print_name classmethod pred vytvorením tohto riadku print_name() Dá sa volať len s objektom, nie s triedou, teraz sa táto metóda môže volať ako classmethod metóda print_name() sa nazýva metóda triedy.
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ýkon
The name is : Geeksforgeeks
Továrenská metóda využívajúca metódu triedy
Použitie funkcie classmethod() sa používa v továrenských návrhových vzoroch, kde chceme volať veľa funkcií s názvom triedy a nie s objektom.
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ýkon
Name : mayank Age : 21
Ako funguje metóda triedy pre dedičstvo?
V tomto príklade vytvárame hierarchiu tried Pythonu s dvoma triedami, Person> a Man> a demonštruje použitie metód triedy a dedič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ýkon
True False
Python @classmethod Decorator
Dekorátor @classmethod je vstavaný funkčný dekoratér čo je výraz, ktorý sa vyhodnotí po definovaní vašej funkcie. Výsledok tohto hodnotenia zatieni vašu definíciu funkcie. Metóda triedy prijíma triedu ako implicitný prvý argument, rovnako ako metóda inštancie prijíma inštanciu.
Syntax classmethod Decorator
trieda C (objekt):
@triedna metóda
def fun(cls, arg1, arg2, …):
….
Kde,
- zábava: funkciu, ktorú je potrebné previesť na metódu triedy
- vracia: metóda triedy pre funkciu.
Poznámka:
- Metóda triedy je metóda, ktorá je viazaná na triedu a nie na objekt triedy.
- Majú prístup k stavu triedy, pretože vyžaduje parameter triedy, ktorý ukazuje na triedu a nie na inštanciu objektu.
- Môže upraviť stav triedy, ktorý by sa použil vo všetkých inštanciách triedy. Môže napríklad upraviť premennú triedy, ktorá by bola použiteľná pre všetky inštancie.
Príklad
V nižšie uvedenom príklade používame staticmethod() a classmethod() na kontrolu, či je osoba dospelá alebo nie.
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ýkon
21 27 True