De klassmetod() är en inbyggd funktion i Python, som returnerar en klassmetod för en given funktion.
classmethod() i Python-syntax
Syntax: klassmetod(funktion)
Parameter: Denna funktion accepterar funktionsnamnet som en parameter.
Returtyp: Denna funktion returnerar den konverterade klassmetoden.
Python classmethod() Funktion
Classmethod()-metoderna är bundna till en klass snarare än ett objekt. Klassmetoder kan anropas av både klass och objekt. Dessa metoder kan anropas med en klass eller med ett objekt.
Klassmetod vs statisk metod
Den grundläggande skillnaden mellan klassmetod vs statisk metod i Python och när man ska använda klassmetoden och statisk metod i Pytonorm .
- En klassmetod tar cls som den första parametern medan en statisk metod inte behöver några specifika parametrar.
- En klassmetod kan komma åt eller ändra klasstillståndet medan en statisk metod inte kan komma åt eller ändra den.
- I allmänhet vet statiska metoder ingenting om klasstillståndet. De är metoder av verktygstyp som tar vissa parametrar och arbetar med dessa parametrar. Å andra sidan måste klassmetoder ha klass som parameter.
- Vi använder @classmethod decorator i Python för att skapa en klassmetod och vi använder @staticmethod decorator för att skapa en statisk metod i Python.
Exempel på klassmetod i Python
Skapa en enkel klassmetod
I det här exemplet ska vi se hur man skapar en klassmetod i Python. För detta skapade vi en klass som heter Geeks med en medlemsvariabel kurs och skapade en funktion som heter köp som skriver ut objektet. Nu klarade vi metodenGeeks.purchase>till en klassmetod med hjälp av@classmethod>decorator, som konverterar metoden till en klassmetod. Med klassmetoden på plats kan vi anropa funktionen köp utan att skapa ett funktionsobjekt, direkt med hjälp av klassnamnet 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>
Skapa klassmetod med classmethod()
Skapade print_name classmethod innan den här raden skapades print_name() Den kan endast anropas med ett objekt som inte är med klassen nu denna metod kan kallas som klassmetod print_name() metoden kallas en klassmetod.
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()> |
>
>
klumpig prickProduktion
The name is : Geeksforgeeks>
Fabriksmetod med en klassmetod
Användning av funktionen classmethod() används i fabriksdesignmönster där vi vill anropa många funktioner med klassnamnet snarare än ett 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>
Hur fungerar klassmetoden för arvet?
I det här exemplet gör vi Python-klasshierarki med två klasser,Person>ochMan>, och demonstrerar användningen av klassmetoder och arv.
Python3
sträng till int java
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 Dekoratör
@classmethod-dekoratören är en inbyggd funktion dekoratör vilket är ett uttryck som utvärderas efter att din funktion har definierats. Resultatet av den utvärderingen skuggar din funktionsdefinition. En klassmetod tar emot klassen som det implicita första argumentet, precis som en instansmetod tar emot instansen.
Syntax för klassmetoden Decorator
klass C(objekt):
@klassmetod
def fun(cls, arg1, arg2, …):
….
Var,
- roligt: funktionen som behöver konverteras till en klassmetod
- returnerar: en klassmetod för funktion.
Notera:
- En klassmetod är en metod som är bunden till klassen och inte klassens objekt.
- De har tillgång till klassens tillstånd eftersom den kräver en klassparameter som pekar på klassen och inte objektinstansen.
- Det kan ändra ett klasstillstånd som skulle gälla för alla instanser av klassen. Till exempel kan den modifiera en klassvariabel som skulle vara tillämplig på alla instanser.
Exempel
I exemplet nedan använder vi en staticmethod() och classmethod() för att kontrollera om en person är vuxen eller inte.
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>