English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di base di Python

Controllo dei flussi di Python

Funzione in Python

Tipi di dati in Python

Operazioni di file di Python

Oggetti e classi di Python

Data e ora di Python

Conoscenze avanzate di Python

Manuale di riferimento di Python

Uso e esempio di classmethod() in Python

Funzioni integrate di Python

Il metodo classmethod() restituisce il metodo di classe di una funzione data.

La sintassi del metodo classmethod() è:

classmethod(function)

Il decoratore @classmethod è considerato non conforme alla specifica di Python, quindi nelle versioni più recenti di Python, è possibile definire i metodi di classe con il decoratore @classmethod.

La sintassi è:

@classmethod
def func(cls, args...)

Parametro di classmethod()

Il metodo classmethod() accetta un parametro:

  • function-Funzione da convertire in metodo di classe

Valore di ritorno di classmethod()

Il metodo classmethod() restituisce il metodo di classe di una funzione data.

Cos'è un metodo di classe?

I metodi di classe sono metodi associati al tipo e non agli oggetti. Non è necessario creare un esempio di classe, comeclassmethod (metodo statico)uguali.

La differenza tra metodi statici e metodi di classe è:

  • I metodi statici non sanno nulla della classe, trattano solo i parametri

  • I metodi di classe vengono usati insieme alla classe, perché il loro parametro è sempre il tipo stesso.

I metodi di classe possono essere chiamati sia dalla classe che dagli oggetti della classe.

Class.classmethod()
O anche
Class().classmethod()

Ma in ogni caso, il metodo di classe è sempre aggiunto al tipo che ha come primo parametro, perché il tipo stesso ècls.

def classMethod(cls, args...)

Esempio 1: Creare un metodo di classe con classmethod()

class Person:
    age = 25
    def printAge(cls):
        print('l'età è:', cls.age)
# creare il metodo di classe printAge
Person.printAge = classmethod(Person.printAge)
Person.printAge()

Quando si esegue il programma, l'output è:

l'età è: 25

Qui, abbiamo una classe Person, le cui variabili di membro sonoetàè stato specificato come 25.

Abbiamo ancora una funzione printAge, che accetta solo un parametro cls, invece del self che usiamo di solito.

clsAccetta come parametro la classe Person, non l'oggetto / esempio Person.

Ora, passiamo il metodo Person.printAge come parametro a questa funzione classmethod. Questo trasformerà il metodo in un metodo di classe, così accetta il primo parametro come classe (cioè Person).

Nella riga finale, chiamando printAge non crea l'oggetto Person come farebbe un metodo statico. Stampa la variabile di classeetà.

Quand'è il momento di utilizzare i metodi di classe?

1. Metodi fabbrica

I metodi fabbrica sono quei metodi che restituiscono oggetti di classe (come costruttori) per diversi casi d'uso.

È simile al ricarico di funzione in C++. Poiché Python non ha questa funzionalità, vengono utilizzati metodi di classe e statici.

Esempio 2: Creare un metodo fabbrica utilizzando i metodi di classe

from datetime import date
# random Person
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @classmethod
    def fromBirthYear(cls, name, birthYear):
        return cls(name, date.today().year - birthYear)
    def display(self):
        print(self.name + "'s age is: " + str(self.age))
person = Person('Adam', 19)
person.display()
person1 = Person.fromBirthYear('John', 1985)
person1.display()

Quando si esegue il programma, l'output è:

L'età di Adam è: 19
L'età di John è: 31

Qui, abbiamo due creatori di esempi di classe, un costruttore e un metodo fromBirthYear.

Il costruttore utilizza i parametri convenzionalinameeetà. Mentre fromBirthYear usacls,nameebirthYeare calcola l'età corrente sottraendo l'anno di nascita corrente dall'età, restituendo un esempio di classe.

Il metodo fromBirthYear prende Person classe (non l'oggetto Person) come primo parametrocls,e chiamando restituisce il costruttore cls(name, date.today().year - birthYear), che è equivalente a Person(name, date.today().year - birthYear)

Prima di questo metodo, vediamo @classmethod. Questo si chiamaDecoratore,Metodo di classe utilizzato per trasformare fromBirthYear in classmethod()

2. Creare correttamente l'esempio nell'ereditarietà

Ogni volta che si implementa un metodo fabbrica come metodo di classe per derivare una classe, può garantire che venga creato correttamente l'esempio della classe derivate.

Puoi creare un metodo statico per l'esempio sopra, ma l'oggetto creato sarà sempre硬编码 di Base classe.

Ma quando si utilizzano i metodi di classe, crea correttamente l'esempio della classe derivate.

Esempio 3: come funzionano i metodi di classe per l'ereditarietà?

from datetime import date
# random Person
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @staticmethod
    def fromFathersAge(name, fatherAge, fatherPersonAgeDiff):
        return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff)
    @classmethod
    def fromBirthYear(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 = 'Male'
man = Man.fromBirthYear('John', 1985)
print(isinstance(man, Man))
man1 = Man.fromFathersAge('John', 1965, 20)
print(isinstance(man1, Man))

Quando si esegue il programma, l'output è:

True
False

In questo caso, per creare un esempio di classe utilizzando un metodo statico, dobbiamo incodificare manualmente il tipo dell'esempio durante il processo di creazione.

Questo ovviamente causerebbe un problema quando Person eredita da Man.

Il metodo fromFathersAge non restituisce un oggetto Man, ma un oggetto della classe base Person.

Questo va contro il paradigma OOP. L'uso del metodo di classe fromBirthYear garantisce che il codice sia orientato agli oggetti, poiché il primo argomento è la classe stessa e chiama il suo metodo factory.

Funzioni integrate di Python