O método classmethod () retorna um método de classe para a função fornecida.
A sintaxe do classmethod()método é:
método de classe (função)
classmethod()é considerado não Pythônico, portanto, em versões mais recentes do Python, você pode usar o @classmethoddecorador para a definição do método de classe .
A sintaxe é:
@classmethod def func (cls, args…)
Parâmetros classmethod ()
classmethod() método leva um único parâmetro:
- function - função que precisa ser convertida em um método de classe
Valor de retorno de classmethod ()
classmethod() método retorna um método de classe para a função fornecida.
O que é um método de classe?
Um método de classe é um método vinculado a uma classe em vez de seu objeto. Não requer a criação de uma instância de classe, muito parecido com o método estático.
A diferença entre um método estático e um método de classe é:
- O método estático não sabe nada sobre a classe e apenas lida com os parâmetros
- O método de classe funciona com a classe, pois seu parâmetro é sempre a própria classe.
O método da classe pode ser chamado tanto pela classe quanto por seu objeto.
Class.classmethod () Ou mesmo Class (). Classmethod ()
Mas não importa o que aconteça, o método de classe é sempre anexado a uma classe com o primeiro argumento como a própria classe cls.
def classMethod (cls, args …)
Exemplo 1: Criar método de classe usando classmethod ()
class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()
Resultado
A idade é: 25
Aqui, temos uma classe Person, com uma variável de membro idade atribuída a 25.
Também temos uma função printAgeque recebe um único parâmetro cls e não selfcostumamos usar.
cls aceita a classe Personcomo um parâmetro em vez do objeto / instância de Person.
Agora, passamos o método Person.printAgecomo um argumento para a função classmethod. Isso converte o método em um método de classe para que ele aceite o primeiro parâmetro como uma classe (ou seja, Person).
Na linha final, chamamos printAgesem criar um objeto Person, como fazemos para métodos estáticos. Isso imprime a variável de classe idade.
Quando você usa o método de classe?
1. Métodos de fábrica
Os métodos de fábrica são aqueles métodos que retornam um objeto de classe (como o construtor) para diferentes casos de uso.
É semelhante à sobrecarga de função em C ++. Uma vez que Python não tem nada como tal, métodos de classe e métodos estáticos são usados.
Exemplo 2: Criar método de fábrica usando método de 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()
Resultado
A idade de Adão é: 19 A idade de João é: 31
Aqui, temos dois criadores de instância de classe, um construtor e um fromBirthYearmétodo.
O construtor usa o nome e a idade dos parâmetros normais. Enquanto, fromBirthYearpega classe, nome e ano de nascimento, calcula a idade atual subtraindo-a do ano atual e retorna a instância da classe.
O método fromBirthYear leva a classe Person (não o objeto Person) como o primeiro parâmetro cls e retorna o construtor chamando cls(name, date.today().year - birthYear), que é equivalente aPerson(name, date.today().year - birthYear)
Antes do método, vemos @classmethod. Isso é chamado de decorador para converter fromBirthYearem um método de classe como classmethod().
2. Criação correta da instância na herança
Sempre que você deriva uma classe da implementação de um método de fábrica como um método de classe, isso garante a criação de instância correta da classe derivada.
Você pode criar um método estático para o exemplo acima, mas o objeto que ele cria sempre será codificado como classe Base.
Mas, quando você usa um método de classe, ele cria a instância correta da classe derivada.
Exemplo 3: Como o método de classe funciona para a herança?
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))
Resultado
Verdadeiro falso
Aqui, o uso de um método estático para criar uma instância de classe quer que codifiquemos o tipo de instância durante a criação.
Isso claramente causa um problema ao herdar Personpara Man.
fromFathersAgemétodo não retorna um Manobjeto, mas o objeto de sua classe base Person.
Isso viola o paradigma OOP. O uso de um método de classe fromBirthYearpode garantir o OOP-ness do código, pois ele recebe o primeiro parâmetro como a própria classe e chama seu método de fábrica.








