Como utilizar o self em Python?

Ao utilizar Orientação a Objetos em Python nos deparamos com o "self", veja algumas dicas para usar corretamente.

Quem começou a programar em Python e está utilizando orientação a objeto se deparou com a palavra chave self , indo direto ao ponto, ela representa a instância de uma classe.

Com a palavra-chave self conseguimos acessar os atributos e métodos de uma classe em Python. Ela é responsável por vincular os atributos com os argumentos enviados para uma função ou método.

O python utiliza essa palavra pois não há a sintaxe @ ou this para referenciar os atributos de instância. O self é sempre o primeiro parâmetro de todos os métodos chamados por uma instância de uma classe (ou seja, um objeto).


Self está sempre apontando para o objeto atual.

Vejamos nosso primeiro exemplo abaixo. A classe teste tem dentro do seu construtor uma mensagem para imprimir o endereço da variável self:

O __init__ é o construtor da classe teste, significa que sempre que um novo objeto for instanciado a mensagem "Endereço do self: " será executado.

Nesse exemplo conseguimos comprovar que a variável self e o objeto obj possuem o mesmo endereço de memória (140229359631696), ou seja, representam a mesma coisa.

Agora vamos estudar um exemplo com atributos na classe.


Portanto, apesar de utilizarmos o self como primeiro argumento na definição de classes e métodos, não precisamos utilizá-lo na chamada. Mas o que acontece se não declararmos o self como primeiro parâmetro na definição? Será que essa palavra é opcional, servindo apenas para melhorar a legibilidade?

No código ao lado. definimos a classe carro com dois parâmetros, modelo e cor. Podemos observar que a palavra self é sempre utilizada como primeiro argumento, tanto do construtor quanto do método mostrar. Nem quando instanciamos os objetos, nem quando chamamos o método mostrar utilizamos esse primeiro argumento self, o python passa essa chamada do método como se estivesse chamando carro.mostrar(audi) ou carro.mostrar(ferrari).

Vejam os exemplos abaixo:

Vamos testar:

Vejam que o python não aceitou o construtor sem o self. Assim chegamos a uma conclusão:

O self é sempre o primeiro argumento a ser passado em um construtor e nos métodos de instâncias.

O último teste que faremos é a utilização de outro parâmetro no lugar do self, será que self é uma palavra reservada e teremos erro?


Não teremos nenhum erro, pois a realidade é que o self não é uma palavra reservada, é apenas uma convenção de boa prática. Melhora a legibilidade.

O self é uma convenção e não uma palavra reservada

É possível utilizar outras palavras no lugar do self, mas preste atenção de utilizá-la em todos os lugares daquele método onde o self iria aparecer. Vejam os dois casos abaixo, no primeiro temos um erro e no segundo tudo funciona sem problemas. Consegue identificar o erro?

E aqui a execução funcionaria sem problemas:

O importante é que alguma palavra seja passada como primeiro argumento e essa palavra sempre fará referencia ao próprio objeto.

Esse self explícito já foi alvo de polêmicas sobre o Python, mas há diversas razões em favor do seu uso. O argumento mais comum é que o self explícito está mais de acordo com o espírito da linguagem que um self implícito, já que, como diria o Zen of Python, explícito é melhor que implícito.

O self explícito tem, também, várias vantagens na prática quotidiana. Uma das mais notáveis é a habilidade de chamar métodos de classes ancestrais sobre objetos de classes herdadas. Mas isso já necessitaria alguma explicação do funcionamento de herança em Python, sendo um conceito um pouco mais avançado.

Por hora vamos ficando por aqui.

Para mais conteúdo de Python, Machine Learning e Visão Computacional nos siga em @aprendadatascience