logo

classmethod() a Python

El mètode de classe () és una funció incorporada a Python, que retorna un mètode de classe per a una funció determinada.

classmethod() a la sintaxi de Python

Sintaxi: classmethod (funció)



Paràmetre: Aquesta funció accepta el nom de la funció com a paràmetre.

Tipus de retorn: Aquesta funció retorna el mètode de classe convertit.

Funció Python classmethod().

Els mètodes classmethod() estan lligats a una classe en lloc d'un objecte. Els mètodes de classe es poden cridar tant per classe com per objecte. Aquests mètodes es poden cridar amb una classe o amb un objecte.



Mètode de classe vs mètode estàtic

La diferència bàsica entre el mètode de classe vs mètode estàtic a Python i quan utilitzar el mètode de classe i el mètode estàtic Python .

  • Un mètode de classe pren cls com a primer paràmetre mentre que un mètode estàtic no necessita paràmetres específics.
  • Un mètode de classe pot accedir o modificar l'estat de la classe mentre que un mètode estàtic no pot accedir-hi ni modificar-lo.
  • En general, els mètodes estàtics no saben res sobre l'estat de classe. Són mètodes de tipus utilitari que prenen alguns paràmetres i treballen sobre aquests paràmetres. D'altra banda, els mètodes de classe han de tenir classe com a paràmetre.
  • Utilitzem @classmethod decorator a Python per crear un mètode de classe i fem servir @staticmethod decorator per crear un mètode estàtic a Python.

Exemple de classmethod en Python

Crear un mètode de classe senzill

En aquest exemple, veurem com crear un mètode de classe en Python. Per a això, vam crear una classe anomenada Geeks amb un curs variable membre i vam crear una funció anomenada compra que imprimeix l'objecte. Ara, hem passat el mètodeGeeks.purchase>en un mètode de classe utilitzant el@classmethod>decorador, que converteix el mètode en un mètode de classe. Amb el mètode de classe al seu lloc, podem trucar a la compra de la funció sense crear un objecte de funció, utilitzant directament el nom de classe Geeks.

Python 3




comanda arp-a



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

>

>

Sortida

Purchase course : DSA>

Crea un mètode de classe utilitzant classmethod()

S'ha creat print_name classmethod abans de crear aquesta línia print_name() Només es pot cridar amb un objecte no amb la classe, ara aquest mètode es pot cridar com a classmethod print_name() El mètode s'anomena mètode de classe.

Python 3


col·leccions en java



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

>

>

Sortida

The name is : Geeksforgeeks>

Mètode de fàbrica utilitzant un mètode de classe

Els usos de la funció classmethod() s'utilitzen en patrons de disseny de fàbrica on volem cridar moltes funcions amb el nom de classe en lloc d'un objecte.

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

>

>

Sortida

Name : mayank Age : 21>

Com funciona el mètode de classe per a l'herència?

En aquest exemple, estem fent una jerarquia de classes Python amb dues classes,Person>iMan>, i demostra l'ús dels mètodes de classe i l'herència.

Python 3




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

>

>

Sortida

True False>

Decorador Python @classmethod

El decorador @classmethod és integrat decorador de funcions que és una expressió que s'avalua després de definir la funció. El resultat d'aquesta avaluació ombreja la definició de la funció. Un mètode de classe rep la classe com a primer argument implícit, igual que un mètode d'instància rep la instància.

scan.next java

Sintaxi de classmethod Decorator

classe C (objecte):

@classmethod

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

….

On,

  • diversió: la funció que cal convertir en un mètode de classe
  • torna: un mètode de classe per a la funció.

Nota:

  • Un mètode de classe és un mètode que està lligat a la classe i no a l'objecte de la classe.
  • Tenen accés a l'estat de la classe ja que pren un paràmetre de classe que apunta a la classe i no a la instància de l'objecte.
  • Pot modificar un estat de classe que s'aplicaria a totes les instàncies de la classe. Per exemple, pot modificar una variable de classe que seria aplicable a totes les instàncies.

Exemple

A l'exemple següent, fem servir un staticmethod() i classmethod() per comprovar si una persona és adulta o no.

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>>18> person1>=> Person(>'mayank'>,>21>)> person2>=> Person.fromBirthYear(>'mayank'>,>1996>)> print>(person1.age)> print>(person2.age)> # print the result> print>(Person.isAdult(>22>))>

>

>

Sortida

21 27 True>