IL metodo di classe() è una funzione incorporata in Python, che restituisce un metodo di classe per una determinata funzione.
classmethod() nella sintassi Python
Sintassi: metodo di classe(funzione)
Parametro: Questa funzione accetta il nome della funzione come parametro.
Tipo di reso: Questa funzione restituisce il metodo della classe convertito.
Funzione classmethod() di Python
I metodi classmethod() sono legati a una classe anziché a un oggetto. I metodi di classe possono essere chiamati sia dalla classe che dall'oggetto. Questi metodi possono essere chiamati con una classe o con un oggetto.
Metodo di classe vs metodo statico
La differenza fondamentale tra il metodo di classe vs metodo statico in Python e quando utilizzare il metodo della classe e il metodo statico in Pitone .
- Un metodo di classe accetta cls come primo parametro mentre un metodo statico non necessita di parametri specifici.
- Un metodo di classe può accedere o modificare lo stato della classe mentre un metodo statico non può accedervi o modificarlo.
- In generale, i metodi statici non sanno nulla dello stato della classe. Sono metodi di tipo utilità che accettano alcuni parametri e funzionano su tali parametri. D'altra parte i metodi di classe devono avere la classe come parametro.
- Usiamo il decoratore @classmethod in Python per creare un metodo di classe e usiamo il decoratore @staticmethod per creare un metodo statico in Python.
Esempio di metodo di classe in Python
Crea un metodo di classe semplice
In questo esempio vedremo come creare un metodo di classe in Python. Per questo, abbiamo creato una classe denominata Geeks con una variabile membro course e creato una funzione denominata Purchase che stampa l'oggetto. Ora abbiamo superato il metodoGeeks.purchase>in un metodo di classe utilizzando il metodo@classmethod>decoratore, che converte il metodo in un metodo di classe. Con il metodo della classe attivo, possiamo chiamare la funzione acquisto senza creare un oggetto funzione, utilizzando direttamente il nome della classe Geeks.
Python3
class> geeks:> >course>=> 'DSA'> >def> purchase(obj):> >print>(>'Purchase course : '>, obj.course)> geeks.purchase>=> classmethod>(geeks.purchase)> geeks.purchase()> |
>
>Produzione
Purchase course : DSA>
Crea un metodo di classe usando classmethod()
Creato print_name classmethod prima di creare questa riga print_name() Può essere chiamato solo con un oggetto non con la classe ora questo metodo può essere chiamato come classmethod Il metodo print_name() è chiamato metodo di classe.
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()> |
>
>Produzione
The name is : Geeksforgeeks>
Metodo Factory utilizzando un metodo Class
Gli usi della funzione classmethod() vengono utilizzati nei modelli di progettazione di fabbrica in cui vogliamo chiamare molte funzioni con il nome della classe anziché con un oggetto.
Python3
alfabeto e numeri
# 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()> |
>
>Produzione
Name : mayank Age : 21>
Come funziona il metodo della classe per l'ereditarietà?
In questo esempio, stiamo creando una gerarchia di classi Python con due classi,Person>EMan>e dimostra l'utilizzo dei metodi di classe e dell'ereditarietà.
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))> |
>
>Produzione
True False>
Decoratore Python @classmethod
Il decoratore @classmethod è integrato decoratore di funzioni che è un'espressione che viene valutata dopo che la funzione è stata definita. Il risultato di tale valutazione oscura la definizione della funzione. Un metodo di classe riceve la classe come primo argomento implicito, proprio come un metodo di istanza riceve l'istanza.
Sintassi del metodo di classe Decoratore
classe C(oggetto):
@classmethod
def fun(cls, arg1, arg2, …):
….
Dove,
- divertimento: la funzione che deve essere convertita in un metodo di classe
- ritorna: un metodo di classe per la funzione.
Nota:
- Un metodo di classe è un metodo associato alla classe e non all'oggetto della classe.
- Hanno accesso allo stato della classe poiché richiede un parametro di classe che punta alla classe e non all'istanza dell'oggetto.
- Può modificare lo stato di una classe che si applicherebbe a tutte le istanze della classe. Ad esempio, può modificare una variabile di classe che sarebbe applicabile a tutte le istanze.
Esempio
Nell'esempio seguente, utilizziamo staticmethod() e classmethod() per verificare se una persona è adulta o meno.
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>))> |
>
>Produzione
21 27 True>