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