Método de classe Python ()

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.

Artigos interessantes...