Skip to content
Tutoriais
Python
python __call__ Method: Everything You Need to Know

Método call em Python: Tudo o que você precisa saber

Python é uma linguagem empolgante, elogiada por sua simplicidade e poderosas capacidades. Ela disponibiliza várias funções e métodos integrados, permitindo que você escreva código eficiente e reutilizável. Mas hoje, vamos focar em um método especial que pode não ser amplamente conhecido para muitos programadores Python - o método __call__.

O método __call__ em Python é um atributo único das classes Python, servindo como parte integral da programação orientada a objetos do Python. Desvendaremos seus propósitos, usos e benefícios, e aprenderemos como usá-lo por meio de exemplos práticos.

Quer criar rapidamente visualizações de dados a partir de um DataFrame do Pandas com código?

PyGWalker é uma biblioteca Python para Análise Exploratória de Dados com Visualização. PyGWalker (opens in a new tab) pode simplificar sua análise de dados e fluxo de trabalho de visualização de dados no Jupyter Notebook, transformando seu DataFrame do pandas (e polars DataFrame) em uma Interface de Usuário no estilo Tableau para exploração visual.

PyGWalker para visualização de dados (opens in a new tab)

O que é o método call em Python?

Na programação em Python, as funções são objetos de primeira classe. Isso significa que elas podem ser atribuídas a variáveis, armazenadas em estruturas de dados, passadas como argumentos ou até mesmo retornadas como valores de outras funções. E se pudéssemos tratar instâncias de classes de forma semelhante? O método __call__ permite exatamente isso.

O método __call__ é um método especial em classes Python, que torna uma instância da classe chamável. Essencialmente, ele permite que uma instância de uma classe seja tratada e executada como uma função, aprimorando a versatilidade da programação orientada a objetos do Python.

Considere este exemplo simples:

class Teste:
    def __call__(self, x):
        return x**2
 
T = Teste()
print(T(5))  # imprime: 25

Aqui, definimos uma classe Teste com um método __call__. Criamos uma instância T da classe Teste. Normalmente, chamar T(5) geraria um TypeError dizendo que o objeto 'Teste' não é chamável. Mas com o método __call__ definido, ele retorna o quadrado do argumento, semelhante a uma função.

Como o método call é usado em Python?

Para utilizar o método __call__, você simplesmente precisa defini-lo dentro da sua classe. O método __call__ pode aceitar qualquer número de argumentos, assim como uma função típica. Portanto, você pode aproveitar esse método para fazer com que as instâncias da sua classe se comportem de acordo com suas necessidades.

Um uso comum do método __call__ em Python é a criação de objetos semelhantes a funções que mantêm estado. Como cada instância da classe pode ter seu próprio estado único, ele pode ser usado para manter algum tipo de estado entre chamadas. Aqui está um exemplo:

class Contador:
    def __init__(self):
        self.contagem = 0
    def __call__(self):
        self.contagem += 1
        return self.contagem
 
C = Contador()
print(C())  # imprime: 1
print(C())  # imprime: 2

Na classe Contador, o método __call__ incrementa uma variável de contagem cada vez que a instância é chamada, criando efetivamente um objeto chamável com estado.

call em Python vs init

Agora, você pode estar se perguntando - qual é a diferença entre __call__ e __init__ em Python? Eles não são ambos métodos em classes Python?

Sim, são, mas eles têm propósitos diferentes. O método __init__ é usado para inicializar uma instância de uma classe. É o método que é chamado quando você cria um novo objeto, também conhecido como uma instância, de uma classe. Por outro lado, o método __call__ torna uma instância chamável como uma função.

Lembre-se, __init__ é chamado uma vez quando o objeto é criado. __call__, por outro lado, pode ser invocado várias vezes sempre que a instância é chamada.

Aqui está um exemplo:

class Teste:
    def __init__(self, valor=0):
        print('método init chamado')
        self.valor = valor
    def __call__(self, x):
        print('método call chamado')
        return self.valor + x
 
T = Teste(5)  # imprime: método init chamado
print(T(10))  # imprime: método call chamado, 15

Neste exemplo, quando criamos uma instância T de Teste, o método __init__ é invocado e imprime 'método init chamado'. Quando chamamos T(10), o método __call__ é invocado e imprime 'método call chamado'.

O método call pode ser usado para criar instâncias chamáveis?

Sim, com certeza! O método __call__ é especificamente projetado para tornar instâncias de classes chamáveis, semelhantes a funções. Isso é uma ótima ferramenta para criar objetos que precisam manter seu estado em várias chamadas. Por exemplo, você pode usá-lo para acompanhar quantas vezes uma função é chamada ou para armazenar resultados que podem ser reutilizados.

Vamos examinar um exemplo de criação de uma classe que gera números Fibonacci, usando o método __call__ para manter o estado em várias chamadas:

class Fibonacci:
    def __init__(self):
        self.cache = {0: 0, 1: 1}
    def __call__(self, n):
        if n not in self.cache:
            self.cache[n] = self.__call__(n-1) + self.__call__(n-2)
        return self.cache[n]
 
F = Fibonacci()
print(F(10))  # imprime: 55

Qual é o propósito do método call em Python?

Em Python, o método __call__ fornece uma maneira de usar instâncias de classes como se fossem funções. Isso oferece flexibilidade, pois permite que as classes exibam comportamento semelhante a funções, ao mesmo tempo em que mantêm sua natureza como objetos de uma classe. O método __call__ também permite que as instâncias mantenham estado entre chamadas, o que pode ser altamente útil em vários cenários de programação.

O método __call__ é apenas um dos muitos métodos especiais em Python que ajudam a fornecer a "mágica" por trás da programação orientada a objetos do Python. Compreender e usar esses métodos de maneira adequada pode melhorar muito a flexibilidade e eficácia do seu código Python.

Vamos mergulhar em nossas perguntas frequentes para encerrar este guia sobre o __call__ em Python.

Perguntas frequentes

1. O que é o método __call__ em Python?

O método __call__ é um método especial em classes Python. Ele permite que uma instância de uma classe seja chamada como uma função. Ele também permite que uma instância de uma classe mantenha um estado que pode ser alterado ou acessado cada vez que a instância é chamada.

2. Qual é a diferença entre os métodos __init__ e __call__ em Python?

O método __init__ é usado para inicializar uma instância de uma classe. Ele é chamado automaticamente quando uma instância da classe é criada. O método __call__, por outro lado, torna uma instância chamável como uma função. Ele pode ser invocado várias vezes e permite que a instância mantenha um estado entre chamadas.

3. O método __call__ pode ser usado para criar instâncias chamáveis?

Sim, o método __call__ pode ser usado para criar instâncias chamáveis. Isso permite que as instâncias de classes se comportem como funções e permite que elas mantenham um estado entre chamadas, tornando-as úteis para vários cenários de programação.

Conclusão

Em resumo, o método __call__ é uma ferramenta poderosa na linguagem de programação Python, oferecendo um comportamento flexível semelhante a uma função para instâncias de classes. Com uma compreensão e uso adequados desse método, você pode criar programas Python mais versáteis e eficientes. Boa codificação!