Métodos Vinculados e Não Vinculados em Python

No Python, métodos são funções definidas dentro de uma classe e representam comportamentos associados a objetos. O primeiro parâmetro de qualquer método é self, que referencia a instância que invoca o método. Quando um método é acessado através de uma instância, ele é vinculado a essa instância; quando acessado diretamente pela classe, é não vinculado.

O parâmetro self é essencial porque permite que o método acesse os atributos da instância. Embora seja necessário declarar self na definição do método, nem sempre é usado dentro do corpo; se o método não utilizar self, pode ser uma candidata a ser uma função comum, a menos que haja razões específicas para mantê-lo como método.

Quando se invoca um método vinculado, o interpretador Python passa automaticamente a instância como primeiro argumento. Em contraste, métodos não vinculados requerem que a instância seja fornecida explicitamente. Isso é demonstrado nos exemplos a seguir:

#!/usr/bin/env python
#coding:utf8

class MinhaClasse:
    def exibir_valor(self, valor):
        self.valor = valor
        print(self.valor)

obj = MinhaClasse()
MinhaClasse.exibir_valor(obj, 42)

No código acima, MinhaClasse.exibir_valor(obj, 42) invoca o método não vinculado, onde obj é passado como self. Em contraste, a chamada obj.exibir_valor(42) usaria o método vinculado.

Em Python 2, métodos não vinculados eram de um tipo específico (unbound method), mas em Python 3, eles são tratados como funções normais. Isso pode ser observado ao inspecionar os atributos:

#!/usr/bin/env python
#coding:utf8

class Exemplo:
    def acao(self):
        pass

inst = Exemplo()
print(inst.acao)  # Método vinculado
print(Exemplo.acao)  # Função em Python 3, método não vinculado em Python 2

A principal aplicação de métodos não vincualdos ocorre na herança, onde uma subclasse pode sobrescrever métodos da superclasse e ainda chamar a implementação original. Isso é feito invocando o método da superclasse com self explicitamente:

#!/usr/bin/env python
#coding:utf8

class Base:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def descricao(self):
        print(f"Nome: {self.nome}, Idade: {self.idade}")

class Derivada(Base):
    def __init__(self, nome, idade, cargo):
        super().__init__(nome, idade)  # Chama o método não vinculado da superclasse
        self.cargo = cargo

    def descricao_completa(self):
        self.descricao()
        print(f"Cargo: {self.cargo}")

obj_d = Derivada("Ana", 30, "Engenheira")
obj_d.descricao_completa()

Ao usar super(), o método __init__ da classe base é chamado como um método não vinculado, garantindo que a instância correta seja passada. Isso facilita a manutenção, pois alterações na hierarquia de herança requerem menos modificações no código.

Tags: Python métodos classes Herança self

Publicado em 6-19 22:45