Pular para o conteúdo

Como usar o método __call__ em Python?

[

Python’s Método __call__(): Criando Instâncias Chamáveis

Em Python, um objeto “chamável” é qualquer objeto que pode ser chamado usando um par de parênteses e, opcionalmente, uma série de argumentos. Funções, classes e métodos são todos exemplos comuns de objetos chamáveis em Python. Além disso, você também pode criar classes personalizadas que produzem instâncias chamáveis. Para fazer isso, você pode adicionar o método especial .__call__() à sua classe.

As instâncias de uma classe com um método .__call__() se comportam como funções, fornecendo uma maneira flexível e conveniente de adicionar funcionalidades aos seus objetos. Compreender como criar e usar instâncias chamáveis é uma habilidade valiosa para você como desenvolvedor Python.

Neste tutorial, você vai:

  • Entender o conceito de objetos chamáveis em Python.
  • Criar instâncias chamáveis fornecendo às suas classes um método .__call__().
  • Compreender a diferença entre .__init__() e .__call__().
  • Codificar vários exemplos de uso de instâncias chamáveis para resolver problemas do mundo real.

Para aproveitar ao máximo este tutorial, você deve estar familiarizado com os conceitos básicos de programação orientada a objetos em Python, incluindo como definir e usar classes e métodos. Alguma familiaridade com decoradores em Python e o padrão de design “strategy” também será útil. Você também deve entender o conceito de estado.

Entendendo Objetos Chamáveis em Python

Um objeto chamável em Python é qualquer objeto que pode ser chamado usando um par de parênteses e uma série de argumentos, se necessário. Você encontrará diferentes exemplos de objetos chamáveis em sua interação diária com o Python. Alguns exemplos incluem:

  • Funções e classes built-in.
  • Funções definidas pelo usuário que você cria com a palavra-chave def.
  • Funções anônimas que você escreve usando a palavra-chave lambda.
  • Os construtores das suas classes personalizadas.
  • Métodos de instância, classe e estáticos.
  • Instâncias de classes que implementam o método .__call__().

Vamos seguir em frente e explorar como criar instâncias chamáveis personalizadas usando o método .__call__().

Criando Instâncias Chamáveis com o Método .__call__() em Python

Para criar uma instância chamável personalizada, você deve adicionar o método .__call__() à sua classe. Esse método especial será executado quando você chamar a instância como uma função.

class Exemplo:
def __call__(self):
print("Olá, eu sou uma instância chamável!")
objeto = Exemplo() # Criando uma instância chamável
objeto() # Chamando a instância como uma função

Saída:

Olá, eu sou uma instância chamável!

Neste exemplo, criamos a classe Exemplo com o método especial .__call__(). Quando chamamos a instância objeto como uma função, o método .__call__() é executado e exibe a mensagem “Olá, eu sou uma instância chamável!“.

Essa é a essência de uma instância chamável em Python. Você pode adicionar qualquer lógica ou funcionalidade que desejar ao método .__call__(), transformando suas instâncias em objetos altamente versáteis e flexíveis.

Compreendendo a Diferença: .__init__() vs .__call__()

Você pode estar se perguntando por que usar o método .__call__() em vez do método .__init__() para adicionar funcionalidades às suas instâncias. Embora os dois métodos sejam executados quando você chama uma instância como uma função, eles têm propósitos diferentes.

  • O método .__init__() é chamado quando você cria uma nova instância da classe. Ele é usado para inicializar os atributos da instância e prepará-la para uso. O método .__init__() é executado apenas uma vez, no momento da criação da instância.

  • Por outro lado, o método .__call__() é executado sempre que você chama a instância como uma função. Ele pode ser usado para adicionar funcionalidades adicionais à instância após a inicialização. O método .__call__() pode ser chamado várias vezes durante a vida útil da instância.

Usando o método .__call__() em vez do método .__init__():

  • Permite que você transforme suas instâncias em objetos chamáveis que podem ser usados como funções.
  • Proporciona uma maneira flexível de adicionar e modificar comportamentos em tempo de execução.
  • Oferece maior controle sobre como as instâncias interagem com outros objetos e partes do seu código.

Agora que você entende a diferença entre .__init__() e .__call__(), vamos explorar algumas aplicação práticas do método .__call__() em Python.