classmethod() i Python

De klassemetode() er en innebygd funksjon i Python, som returnerer en klassemetode for en gitt funksjon.

classmethod() i Python-syntaks

Syntaks: klassemetode (funksjon)

Parameter : Denne funksjonen godtar funksjonsnavnet som en parameter.

Returtype: Denne funksjonen returnerer den konverterte klassemetoden.

Python classmethod() Funksjon

Classmethod()-metodene er bundet til en klasse i stedet for et objekt. Klassemetoder kan kalles av både klasse og objekt. Disse metodene kan kalles med en klasse eller med et objekt.

Klassemetode vs statisk metode

Den grunnleggende forskjellen mellom klassemetode vs statisk metode i Python og når du skal bruke klassemetoden og statisk metode i Python .

  • En klassemetode tar cls som den første parameteren mens en statisk metode ikke trenger noen spesifikke parametere.
  • En klassemetode kan få tilgang til eller endre klassetilstanden mens en statisk metode ikke kan få tilgang til eller endre den.
  • Generelt vet statiske metoder ingenting om klassetilstanden. De er verktøy-metoder som tar noen parametere og jobber med disse parameterne. På den annen side må klassemetoder ha klasse som parameter.
  • Vi bruker @classmethod decorator i Python for å lage en klassemetode og vi bruker @staticmethod decorator for å lage en statisk metode i Python.

Eksempel på klassemetode i Python

Lag en enkel klassemetode

I dette eksemplet skal vi se hvordan du lager en klassemetode i Python. For dette opprettet vi en klasse kalt Geeks med et medlemsvariabelt kurs og laget en funksjon kalt kjøp som skriver ut objektet. Nå besto vi metoden Geeks.purchase> inn i en klassemetode ved hjelp av @classmethod> decorator, som konverterer metoden til en klassemetode. Med klassemetoden på plass kan vi kalle funksjonen kjøp uten å lage et funksjonsobjekt, direkte ved å bruke klassenavnet Geeks.

Python3




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

Produksjon

Purchase course : DSA 

Lag klassemetode ved hjelp av klassemetode()

Opprettet print_name klassemetode før du opprettet denne linjen print_name() Den kan kalles bare med et objekt som ikke er med klassen nå kan denne metoden kalles som klassemetode print_name() metode kalles en klassemetode.

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()>

Produksjon

The name is : Geeksforgeeks 

Fabrikkmetode som bruker en klassemetode

Bruk av classmethod()-funksjonen brukes i fabrikkdesignmønstre hvor vi ønsker å kalle mange funksjoner med klassenavnet i stedet for et objekt.

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()>

Produksjon

Name : mayank Age : 21 

Hvordan fungerer klassemetoden for arven?

I dette eksemplet lager vi Python-klassehierarki med to klasser, Person> og Man> , og demonstrerer bruken av klassemetoder og arv.

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))>

Produksjon

True False 

Python @classmethod Dekorator

@classmethod-dekoratøren er en innebygd funksjonsdekoratør som er et uttrykk som blir evaluert etter at funksjonen din er definert. Resultatet av den evalueringen skygger funksjonsdefinisjonen din. En klassemetode mottar klassen som det implisitte første argumentet, akkurat som en instansmetode mottar instansen.

Syntaks for klassemetode Dekorator

klasse C(objekt):

@klassemetode

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

….

Hvor,

  • moro: funksjonen som må konverteres til en klassemetode
  • returnerer: en klassemetode for funksjon.

Merk:

  • En klassemetode er en metode som er bundet til klassen og ikke objektet til klassen.
  • De har tilgang til klassens tilstand ettersom den krever en klasseparameter som peker til klassen og ikke objektforekomsten.
  • Den kan endre en klassetilstand som vil gjelde for alle forekomster av klassen. For eksempel kan den endre en klassevariabel som kan gjelde for alle forekomster.

Eksempel

I eksemplet nedenfor bruker vi en staticmethod() og classmethod() for å sjekke om en person er voksen eller ikke.

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> ))>

Produksjon

21 27 True