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

Tutoriel de base Python

Contrôle des flux Python

Fonctions en Python

Types de données en Python

Opérations sur les fichiers Python

Objets et classes Python

Dates et heures Python

Connaissances avancées Python

Manuel de référence Python

Utilisation et exemple de classmethod() en Python

Fonctions intégrées de Python

La méthode classmethod() retourne la méthode de classe de la fonction donnée.

La syntaxe de la méthode classmethod() est :

classmethod(function)

La méthode classmethod() est considérée comme non conforme à la norme Python, donc dans les versions plus récentes de Python, vous pouvez utiliser le décorateur @classmethod pour définir une méthode de classe.

La syntaxe est :

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

Paramètres de classmethod()

La méthode classmethod() prend un paramètre :

  • Fonction-Fonction nécessitant la conversion en méthode de classe

Retour de classmethod()

La méthode classmethod() retourne la méthode de classe de la fonction donnée.

Qu'est-ce qu'une méthode de classe ?

Les méthodes de classe sont liées à la classe plutôt qu'à l'objet. Elle n'a pas besoin de créer d'exemple de classe, commeclassmethod (méthode statique)Idem.

La différence entre les méthodes statiques et les méthodes de classe est :

  • Les méthodes statiques ignorent la classe, elles traitent uniquement les paramètres

  • Les méthodes de classe sont utilisées avec la classe, car leurs paramètres sont toujours la classe elle-même.

Les méthodes de classe peuvent être appelées par la classe et ses objets.

Class.classmethod()
Ou même
Class().classmethod()

Mais sous quelque forme que ce soit, la méthode de classe est toujours attachée à la classe qui a le premier paramètre, car la classe elle-même estcls

def classMethod(cls, args...)

Exemple1Utiliser classmethod() pour créer une méthode de classe

class Person:
    age = 25
    def printAge(cls):
        print('L'âge est :', cls.age)
# créer une méthode de classe printAge
Person.printAge = classmethod(Person.printAge)
Person.printAge()

Lors de l'exécution de ce programme, la sortie est :

L'âge est : 25

在这里,我们有一个class Person,其成员变量age被指定为25。

我们还有一个函数printAge,它只接受一个参数cls,而不是我们通常使用的self。

cls接受类Person作为参数,而不是Person的对象/示例。

现在,我们将该方法Person.printAge作为参数传递给该函数classmethod。这会将方法转换为类方法,以便它接受第一个参数作为类(即Person)。

在最后一行中,调用时printAge没有像静态方法那样创建Person对象。这将打印类变量age

什么时候使用类方法?

1.工厂方法

工厂方法是那些针对不同用例返回类对象(如构造函数)的方法。

它类似于C ++中的函数重载。由于Python没有这样的功能,因此使用了类方法和静态方法。

Exemple2:使用类方法创建工厂方法

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

Lors de l'exécution de ce programme, la sortie est :

Adam's age is: 19
John's age is: 31

在这里,我们有两个类示例创建者,一个构造函数和一个fromBirthYear方法。

构造函数采用常规参数nameage。而fromBirthYear采用clsnamebirthYear,通过用当前年份减去当前年龄来计算当前年龄,并返回类示例。

fromBirthYear方法将Person类(不是Person对象)作为第一个参数cls,并通过调用返回构造函数cls(name, date.today().year - birthYear),这等效于Person(name, date.today().year - birthYear)

在该方法之前,我们看到了@classmethod。这称为Décorateur,用于转换fromBirthYear为classmethod()的类方法。

2.在继承中正确创建示例

每当将工厂方法实现为类方法来派生一个类时,它都可以确保正确创建派生类的示例。

您可以为上面的示例创建一个静态方法,但是它创建的对象将始终被硬编码为Base类。

但是,当您使用类方法时,它将创建派生类的正确示例。

Exemple3:如何通过类方法进行继承?

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

Lors de l'exécution de ce programme, la sortie est :

True
False

Ici, pour créer une instance de classe en utilisant une méthode statique, nous devons encoder manuellement le type d'instance pendant le processus de création.

Cela semble évidemment entraîner un problème lorsque Person hérite de Man.

La méthode fromFathersAge ne retourne pas l'objet Man, mais l'objet de la classe mère Person.

Cela viole le paradigme OOP. L'utilisation de la méthode de classe fromBirthYear assure que le code est orienté objet, car elle utilise le premier paramètre comme classe elle-même et appelle sa méthode d'usine.

Fonctions intégrées de Python