English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O método classmethod() retorna o método de classe de uma função dada.
A sintaxe do método classmethod() é:
classmethod(function)
O método classmethod() é considerado incorreto em conformidade com a especificação Python, então pode-se usar o decorador @classmethod para definir métodos de classe em versões mais novas do Python.
A sintaxe é:
@classmethod def func(cls, args...)
O método classmethod() aceita um parâmetro:
function-Função que precisa ser convertida em método de classe
O método classmethod() retorna o método de classe de uma função dada.
Os métodos de classe estão ligados ao tipo e não ao objeto. Eles não precisam criar um exemplo do tipo, comoclassmethod (método estático)igual.
A diferença entre métodos estáticos e métodos de classe é:
Os métodos estáticos não sabem nada sobre o tipo, eles apenas lidam com os parâmetros
Os métodos de classe são usados com tipos, porque seus parâmetros sempre são o tipo em si.
Os métodos de classe podem ser chamados por tipos e objetos.
Class.classmethod() Ou até Class().classmethod()
Mas de qualquer forma, o método de classe sempre está anexado ao tipo que possui o primeiro parâmetro, porque o tipo em si écls。
def classMethod(cls, args...)
class Person: age = 25 def printAge(cls): print('Idade é:', cls.age) # criar método de classe printAge Person.printAge = classmethod(Person.printAge) Person.printAge()
Quando o programa é executado, a saída é:
Idade é: 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, idade): self.name = name self.idade = idade @classmethod def fromBirthYear(cls, name, anoNascimento): return cls(name, date.today().year - anoNascimento) def display(self): print(self.name + "'s age is: " + str(self.idade)) person = Person('Adam', 19) person.display() person1 = Person.fromBirthYear('John', 1985) person1.display()
Quando o programa é executado, a saída é:
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 - anoNascimento)
在该方法之前,我们看到了@classmethod。这称为装饰器,用于转换fromBirthYear为classmethod()的类方法。
每当将工厂方法实现为类方法来派生一个类时,它都可以确保正确创建派生类的示例。
您可以为上面的示例创建一个静态方法,但是它创建的对象将始终被硬编码为Base类。
但是,当您使用类方法时,它将创建派生类的正确示例。
from datetime import date # random Person class Person: def __init__(self, name, idade): self.name = name self.idade = idade @staticmethod def fromFathersAge(name, idadePai, diferencaIdadePai): return Person(name, date.today().year - idadePai + diferencaIdadePai) @classmethod def fromBirthYear(cls, name, anoNascimento): return cls(name, date.today().year - anoNascimento) def display(self): print(self.name + "'s age is: " + str(self.idade)) class Man(Person): sexo = 'Masculino' man = Man.fromBirthYear('John', 1985) print(isinstance(man, Man)) man1 = Man.fromFathersAge('John', 1965, 20) print(isinstance(man1, Man))
Quando o programa é executado, a saída é:
True False
Aqui, a criação de exemplos de classe usando métodos estáticos requer que codifiquemos o tipo de exemplo durante o processo de criação.
Isso claramente levará a um problema, quando Person herdar de Man.
O método fromFathersAge não retorna um objeto Man, mas um objeto da classe base Person.
Isso viola o paradigma OOP. O uso do método de classe fromBirthYear garante que o código seja orientado a objetos, pois ele usa o primeiro parâmetro como a classe em si e chama seu método factory.