Pular para o conteúdo

Como Usar o Método Estático no Python

[

Python’s Instance, Class, and Static Methods Demystified

Neste tutorial, vamos desmistificar os conceitos de métodos de instância, métodos de classe e métodos estáticos em Python. Com uma compreensão intuitiva das diferenças entre eles, você será capaz de escrever Python orientado a objetos que comunica sua intenção de forma mais clara e será mais fácil de manter a longo prazo.

Métodos de instância, métodos de classe e métodos estáticos - Uma visão geral

Vamos começar escrevendo uma classe em Python 3 que contém exemplos simples para os três tipos de métodos:

class MyClass:
def method(self):
return 'método de instância chamado', self
@classmethod
def classmethod(cls):
return 'método de classe chamado', cls
@staticmethod
def staticmethod():
return 'método estático chamado'

Métodos de instância

O primeiro método, chamado method, é um método de instância regular. Esse é o tipo básico de método que você usará na maioria das vezes. Como podemos ver, esse método recebe um parâmetro chamado self, que se refere a uma instância da classe MyClass quando o método é chamado. Por meio desse parâmetro self, os métodos de instância têm acesso livre a atributos e outros métodos do mesmo objeto. Isso proporciona um grande poder na modificação do estado do objeto. Além de modificar o estado do objeto, os métodos de instância também podem acessar a própria classe por meio do atributo self.__class__, o que significa que eles também podem modificar o estado da classe.

Métodos de classe

Agora, vamos comparar o método MyClass.classmethod. Este método é marcado com o decorador @classmethod para indicar que é um método de classe. Em vez de aceitar o parâmetro self, os métodos de classe recebem o parâmetro cls, que se refere à classe e não à instância do objeto, quando o método é chamado. Como o método de classe só tem acesso a esse argumento cls, ele não pode modificar o estado da instância do objeto. Isso exigiria acesso ao self. No entanto, os métodos de classe ainda podem modificar o estado da classe, que se aplica a todas as instâncias da classe.

Métodos estáticos

O terceiro método, MyClass.staticmethod, foi marcado com o decorador @staticmethod. Os métodos estáticos são métodos que não recebem um parâmetro especial como self ou cls. Eles são apenas funções dentro da classe e não têm acesso a atributos da instância ou da classe. Portanto, eles não podem modificar o estado da instância do objeto nem o estado da classe. Os métodos estáticos são úteis quando você precisa definir uma função que está logicamente relacionada à classe, mas não precisa de acesso a seus atributos.

Agora que entendemos a diferença entre esses três tipos de métodos, vamos ver como eles funcionam na prática.

Vamos vê-los em ação!

Vamos criar uma instância da classe MyClass e chamar seus métodos para ver os resultados:

obj = MyClass()
print(obj.method())
print(obj.classmethod())
print(obj.staticmethod())

Saída:

('método de instância chamado', <__main__.MyClass object at 0x7f816bfe6e10>)
('método de classe chamado', <class '__main__.MyClass'>)
método estático chamado

Como podemos ver, quando chamamos o método method(), ele retorna uma string indicando que o método de instância foi chamado, junto com a referência ao objeto MyClass. Quando chamamos o método classmethod(), ele retorna uma string indicando que o método de classe foi chamado, junto com a referência à classe MyClass. E, finalmente, quando chamamos o método staticmethod(), ele retorna uma string indicando que o método estático foi chamado.

Pizzas deliciosas com @classmethod

Vamos criar uma classe Pizza que usa um método de classe para criar diferentes tipos de pizzas:

class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
def __str__(self):
return f'Pizza({self.ingredients})'
@classmethod
def margherita(cls):
return cls(['queijo', 'manjericão', 'tomate'])
@classmethod
def pepperoni(cls):
return cls(['queijo', 'pepperoni', 'tomate'])

Agora, podemos criar diferentes tipos de pizzas usando os métodos de classe:

margherita = Pizza.margherita()
pepperoni = Pizza.pepperoni()
print(margherita) # Pizza(['queijo', 'manjericão', 'tomate'])
print(pepperoni) # Pizza(['queijo', 'pepperoni', 'tomate'])

Neste exemplo, os métodos de classe margherita() e pepperoni() retornam instâncias da própria classe Pizza com ingredientes específicos. Isso nos permite criar diferentes tipos de pizzas de maneira mais fácil e legível.

Quando usar métodos estáticos

Os métodos estáticos são úteis quando você precisa definir uma função relacionada à classe, mas que não requer acesso a seus atributos. Vamos criar uma classe MathUtils com um método estático para calcular a área de um círculo:

import math
class MathUtils:
@staticmethod
def circle_area(radius):
return math.pi * radius**2

Agora, podemos chamar o método estático circle_area() sem precisar criar uma instância da classe MathUtils:

area = MathUtils.circle_area(5)
print(area) # 78.53981633974483

O método estático circle_area() calcula a área de um círculo com base no raio fornecido, sem precisar de acesso a nenhum atributo da classe MathUtils. Portanto, não é necessário criar uma instância da classe para chamar esse método.

Conclusão

Neste tutorial, nós exploramos os conceitos de métodos de instância, métodos de classe e métodos estáticos em Python. A compreensão desses conceitos é fundamental para escrever código orientado a objetos claro, legível e fácil de manter. Agora você tem as ferramentas necessárias para utilizar esses diferentes tipos de métodos adequadamente em seus projetos Python. Então, aproveite ao máximo e escreva um código Python limpo e eficiente!