1
resposta

Referência externa para entender o classmethod

Encontrei no StackOverflow uma explicação mais detalhada: https://pt.stackoverflow.com/questions/57513/funcionamento-classmethod

A minha principal dificuldade estava sendo em entender em que contexto eu usaria um classmethod.

Um método de classe/estático pode ser usado para qualquer coisa, mas faz mais sentido usá-lo para coisas que têm relação com a classe sendo definida (do contrário, por que colocá-lo numa classe, e não diretamente no módulo?). Uma possibilidade é usá-lo como fábrica, customizando a criação de objetos não necessariamente da mesma classe (por exemplo usando subclasses quando apropriado), ou mesmo quando a classe é a mesma, variando os parâmetros recebidos. Mas há muitas outras. Pessoalmente, não me recordo de situações na qual um método de classe me foi útil [em Python], embora lembre vagamente de já tê-lo utilizado.

1 resposta

Ao meu ver classmethods possuem uso bem específico, mas podemos ver eles sendo usados como construtores alternativos, por exemplo:

from datetime import date


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
        return cls(name, date.today().year - birth_year)

    def display(self):
        print(f'{self.name} age is {self.age}')

>>> person = Person('Adam', 19)
>>> person.display()
Adam age is: 19

>>> person1 = Person.from_birth_year('John',  1985)
>>> person1.display()
John age is: 35

Também é útil quando estamos trabalhando com herança, por exemplo:

class Animal:
    @classmethod
    def hello(cls):
        print(f'Hello from {cls.__name__}')

class Dog(Animal):
    pass

>>> Animal.hello()
Hello from Animal

>>> Dog.hello()
Hello from Dog

Com staticmethod:

class Animal:
    @staticmethod
    def hello():
        print(f'Hello from {Animal.__name__}')

class Dog(Animal):
    pass

>>> Animal.hello()
Hello from Animal

>>> Dog.hello()
Hello from Animal

Também acredito que é uma boa prática utilizar classmethod ou staticmethod quando não precisamos usar o self para acessar algo do objeto, assim deixamos explícito que é seguro chamar aquele método, ou seja, que ele não terá nenhum side effect no objeto.