classmethod() Pythonissa
The luokkamenetelmä () on Pythonin sisäänrakennettu funktio, joka palauttaa luokkametodin tietylle funktiolle.
classmethod() Python-syntaksissa
Syntaksi: luokkamenetelmä (funktio)
Parametri: Tämä funktio hyväksyy funktion nimen parametriksi.
Palautustyyppi: Tämä funktio palauttaa muunnetun luokan menetelmän.
Python classmethod() Funktio
Classmethod()-menetelmät on sidottu luokkaan eikä objektiin. Luokkametodeja voi kutsua sekä luokka että objekti. Näitä menetelmiä voidaan kutsua luokan tai objektin kanssa.
Luokkamenetelmä vs staattinen menetelmä
Perusero välillä luokkamenetelmä vs staattinen menetelmä Pythonissa ja milloin käyttää luokkamenetelmää ja staattista menetelmää Python .
- Luokkamenetelmä ottaa cls:n ensimmäisenä parametrina, kun taas staattinen menetelmä ei tarvitse erityisiä parametreja.
- Luokkamenetelmä voi käyttää tai muokata luokan tilaa, kun taas staattinen menetelmä ei voi käyttää tai muokata sitä.
- Yleensä staattiset menetelmät eivät tiedä mitään luokan tilasta. Ne ovat apuohjelmatyyppisiä menetelmiä, jotka ottavat joitain parametreja ja toimivat näiden parametrien mukaan. Toisaalta luokkametodeissa täytyy olla luokka parametrina.
- Käytämme @classmethod decoratoria Pythonissa luokkamenetelmän luomiseen ja @staticmethod decoratoria staattisen menetelmän luomiseen Pythonissa.
Esimerkki luokkamenetelmästä Pythonissa
Luo yksinkertainen luokkamenetelmä
Tässä esimerkissä aiomme nähdä kuinka luodaan luokkametodi Pythonissa. Tätä varten loimme luokan nimeltä Geeks, jossa on jäsenmuuttujakurssi, ja loimme funktion nimeltä buy, joka tulostaa objektin. Nyt hyväksyimme menetelmän Geeks.purchase> luokkamenetelmään käyttämällä @classmethod> decorator, joka muuntaa menetelmän luokkamenetelmäksi. Kun luokkametodi on käytössä, voimme kutsua funktion ostoa luomatta funktioobjektia, suoraan käyttämällä luokan nimeä Geeks.
Python 3
class> geeks:> > course> => 'DSA'> > def> purchase(obj):> > print> (> 'Purchase course : '> , obj.course)> geeks.purchase> => classmethod> (geeks.purchase)> geeks.purchase()> |
Lähtö
Purchase course : DSA
Luo luokkametodi käyttämällä classmethod()
Luotu print_name classmethod ennen tämän rivin luomista print_name() Sitä voidaan kutsua vain objektilla, joka ei ole luokassa nyt tätä menetelmää voidaan kutsua luokkamenetelmänä print_name() -menetelmää kutsutaan luokkametodiksi.
Python 3
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()> |
Lähtö
The name is : Geeksforgeeks
Tehdasmenetelmä käyttäen luokkamenetelmää
Classmethod()-funktion käyttöä käytetään tehdassuunnittelumalleissa, joissa haluamme kutsua monia funktioita luokan nimellä objektin sijaan.
Python 3
# 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()> |
Lähtö
Name : mayank Age : 21
Miten luokkametodi toimii perinnössä?
Tässä esimerkissä teemme Python-luokkahierarkian kahdella luokalla, Person> ja Man> , ja osoittaa luokkamenetelmien käytön ja periytymisen.
Python 3
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))> |
Lähtö
True False
Python @classmethod Decorator
@classmethod-sisustin on sisäänrakennettu toiminnallinen sisustaja joka on lauseke, joka arvioidaan sen jälkeen, kun funktio on määritetty. Tämän arvioinnin tulos varjostaa funktion määritelmääsi. Luokkametodi vastaanottaa luokan implisiittisenä ensimmäisenä argumenttina, aivan kuten ilmentymämetodi vastaanottaa ilmentymän.
Luokkamenetelmän Decorator syntaksi
luokka C (objekti):
@luokkamenetelmä
def fun(cls, arg1, arg2, …):
….
Missä,
- hauskaa: funktio, joka on muutettava luokkamenetelmäksi
- palauttaa: funktion luokkamenetelmä.
Huomautus:
- Luokkametodi on menetelmä, joka on sidottu luokkaan eikä luokan objektiin.
- Heillä on pääsy luokan tilaan, koska se ottaa luokkaparametrin, joka osoittaa luokkaan eikä objektiinstanssiin.
- Se voi muokata luokan tilaa, joka koskisi kaikkia luokan esiintymiä. Se voi esimerkiksi muokata luokkamuuttujaa, joka soveltuu kaikkiin esiintymiin.
Esimerkki
Alla olevassa esimerkissä käytämme staticmethod()- ja classmethod()-metodia tarkistaaksemme, onko henkilö aikuinen vai ei.
Python 3
# 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>>> ,> 21> )> person2> => Person.fromBirthYear(> 'mayank'> ,> 1996> )> print> (person1.age)> print> (person2.age)> # print the result> print> (Person.isAdult(> 22> ))> |
Lähtö
21 27 True