classmethod() i Python

Det klassemetode() er en indbygget funktion i Python, som returnerer en klassemetode for en given funktion.

classmethod() i Python-syntaks

Syntaks: klassemetode (funktion)

Parameter: Denne funktion accepterer funktionsnavnet som en parameter.

Returtype: Denne funktion returnerer den konverterede klassemetode.

Python classmethod() Funktion

Classmethod()-metoderne er bundet til en klasse i stedet for et objekt. Klassemetoder kan kaldes af både klasse og objekt. Disse metoder kan kaldes med en klasse eller med et objekt.

Klassemetode vs statisk metode

Den grundlæggende forskel mellem klassemetode vs statisk metode i Python og hvornår man skal bruge klassemetoden og den statiske metode i Python .

  • En klassemetode tager cls som den første parameter, mens en statisk metode ikke behøver specifikke parametre.
  • En klassemetode kan få adgang til eller ændre klassetilstanden, mens en statisk metode ikke kan få adgang til eller ændre den.
  • Generelt ved statiske metoder intet om klassetilstanden. De er værktøjsmetoder, der tager nogle parametre og arbejder på disse parametre. På den anden side skal klassemetoder have klasse som parameter.
  • Vi bruger @classmethod decorator i Python til at skabe en klassemetode, og vi bruger @staticmethod decorator til at skabe en statisk metode i Python.

Eksempel på klassemetode i Python

Lav en enkel klassemetode

I dette eksempel skal vi se, hvordan man opretter en klassemetode i Python. Til dette oprettede vi en klasse ved navn Geeks med et medlemsvariabelt kursus og oprettede en funktion ved navn køb, som udskriver objektet. Nu bestod vi metoden Geeks.purchase> ind i en klassemetode ved hjælp af @classmethod> decorator, som konverterer metoden til en klassemetode. Med klassemetoden på plads kan vi kalde funktionen køb uden at oprette et funktionsobjekt, direkte ved at bruge klassenavnet Geeks.

Python3




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

Produktion

Purchase course : DSA 

Opret klassemetode ved hjælp af klassemetode()

Oprettet print_name classmethod før oprettelse af denne linje print_name() Det kan kun kaldes med et objekt ikke med klassen nu kan denne metode kaldes som klassemetode print_name() metode kaldes en klasse metode.

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

Produktion

The name is : Geeksforgeeks 

Fabriksmetode ved hjælp af en klassemetode

Brug af funktionen classmethod() bruges i fabriksdesignmønstre, hvor vi ønsker at kalde mange funktioner 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()>

Produktion

Name : mayank Age : 21 

Hvordan fungerer klassemetoden for arven?

I dette eksempel laver vi Python klassehierarki med to klasser, Person> og Man> , og demonstrerer brugen af ​​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))>

Produktion

True False 

Python @classmethod Decorator

@classmethod dekoratøren er en indbygget funktion dekoratør som er et udtryk, der bliver evalueret efter din funktion er defineret. Resultatet af denne evaluering skygger din funktionsdefinition. En klassemetode modtager klassen som det implicitte første argument, ligesom en instansmetode modtager instansen.

Syntaks af klassemetode Dekorator

klasse C(objekt):

@klassemetode

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

….

Hvor,

  • sjovt: funktionen, der skal konverteres til en klassemetode
  • vender tilbage: en klassemetode til funktion.

Bemærk:

  • En klassemetode er en metode, der er bundet til klassen og ikke klassens objekt.
  • De har adgang til klassens tilstand, da det kræver en klasseparameter, der peger på klassen og ikke objektforekomsten.
  • Det kan ændre en klassetilstand, der gælder på tværs af alle forekomster af klassen. For eksempel kan den ændre en klassevariabel, der vil være gældende for alle forekomster.

Eksempel

I eksemplet nedenfor bruger vi en staticmethod() og classmethod() til at kontrollere, om en person er voksen eller ej.

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

Produktion

21 27 True