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 @classmethod
decorador 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 printAge
que recebe um único parâmetro cls e não self
costumamos usar.
cls aceita a classe Person
como um parâmetro em vez do objeto / instância de Person.
Agora, passamos o método Person.printAge
como 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 printAge
sem 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 fromBirthYear
método.
O construtor usa o nome e a idade dos parâmetros normais. Enquanto, fromBirthYear
pega 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 fromBirthYear
em 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 Person
para Man
.
fromFathersAge
método não retorna um Man
objeto, mas o objeto de sua classe base Person
.
Isso viola o paradigma OOP. O uso de um método de classe fromBirthYear
pode 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.