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