Em [[Linguagem de programação Python|Python]], podemos definir métodos dentro de uma [[Classes em Python|classe]] que podem ser chamados diretamente na classe, sem a necessidade de criar uma instância (objeto) da classe. Isso é feito usando o decorador `@classmethod`.
**Explicação:**
* **Métodos de instância:** São os métodos que normalmente usamos em classes. Eles recebem `self` como primeiro argumento, que representa a instância do objeto. Precisamos criar um objeto da classe para chamar esses métodos.
* **Métodos de classe:** São decorados com `@classmethod`. Eles recebem `cls` como primeiro argumento, que representa a própria classe. Podemos chamar esses métodos diretamente na classe, sem precisar de um objeto.
**Exemplo:**
```python
import random
class Hat:
Houses = ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]
@classmethod
def sort(cls, name):
print(f"{name} is in {random.choice(cls.Houses)}")
Hat.sort("Harry") # Output: Harry is in Slytherin (ou outra casa aleatória)
```
* `@classmethod`: Este decorador indica que o método `sort` é um método de classe.
* `cls`: Representa a classe `Hat`.
* `Hat.sort("Harry")`: Chamamos o método `sort` diretamente na classe `Hat`, sem criar um objeto `Hat`.
**Quando usar métodos de classe?**
* Quando você precisa de um método que opere na classe em si, em vez de em uma instância da classe.
* Para criar métodos de fábrica, que retornam instâncias da classe (ou de subclasses).
* Para acessar ou modificar atributos da classe.
**Referência:**
* [Página de Classes Python da W3schools](https://www.w3schools.com/python/python_classes.asp)