English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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...)
La méthode classmethod() prend un paramètre :
Fonction-Fonction nécessitant la conversion en méthode de classe
La méthode classmethod() retourne la méthode de classe de la fonction donnée.
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...)
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。
工厂方法是那些针对不同用例返回类对象(如构造函数)的方法。
它类似于C ++中的函数重载。由于Python没有这样的功能,因此使用了类方法和静态方法。
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方法。
构造函数采用常规参数name和age。而fromBirthYear采用cls,name和birthYear,通过用当前年份减去当前年龄来计算当前年龄,并返回类示例。
fromBirthYear方法将Person类(不是Person对象)作为第一个参数cls,并通过调用返回构造函数cls(name, date.today().year - birthYear),这等效于Person(name, date.today().year - birthYear)
在该方法之前,我们看到了@classmethod。这称为Décorateur,用于转换fromBirthYear为classmethod()的类方法。
每当将工厂方法实现为类方法来派生一个类时,它都可以确保正确创建派生类的示例。
您可以为上面的示例创建一个静态方法,但是它创建的对象将始终被硬编码为Base类。
但是,当您使用类方法时,它将创建派生类的正确示例。
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.