1) Por que é self
exigido como parâmetro explícito nas assinaturas de métodos?
Porque métodos são funções e foo.bar(baz)
são apenas açúcar sintático para bar(foo, baz)
. Classes são apenas dicionários em que alguns dos valores são funções. (Construtores também são apenas funções, e é por isso que o Python não precisa new
). Você pode dizer que o Python torna explícito que os objetos são criados a partir de componentes mais simples. Isso está de acordo com a filosofia "explícito é melhor que implícito".
Por outro lado, em Java, os objetos são realmente mágicos e não podem ser reduzidos a componentes mais simples da linguagem. Em Java (pelo menos até Java 8), uma função é sempre um método de propriedade de um objeto, e essa propriedade não pode ser alterada devido à natureza estática da linguagem. Portanto, não há ambiguidade sobre o que this
se refere, portanto, faz sentido tê-lo definido implicitamente.
JavaScript é um exemplo de uma linguagem implícita this
como Java, mas onde funções podem existir separadamente de objetos como em Python. Isso leva a muita confusão sobre o que this
se refere a quando funções são passadas e chamadas em diferentes contextos. Muitos pensam instintivamente que this
devem se referir a alguma propriedade intrínseca da função, enquanto na verdade é puramente determinada pela maneira como a função é chamada. Eu acredito que ter this
como parâmetro explícito como em Python tornaria isso muito menos confuso.
Alguns outros benefícios do self
parâmetro explícito :
Decoradores são apenas funções que envolvem outras funções. Como os métodos são apenas funções, os decoradores funcionam tão bem quanto os métodos. Se houvesse algum tipo de identidade implícita, os decoradores não trabalhariam de maneira transparente nos métodos.
Métodos de classe e métodos estáticos não aceitam um parâmetro de instância. Os métodos de classe usam uma classe como o primeiro argumento (normalmente chamado cls
). O parâmetro explícito self
ou cls
torna muito mais claro o que está acontecendo e o que você tem acesso no método.
2) Por que as variáveis de instância sempre devem ser qualificadas com " self.
?
Em Java, você não precisa prefixar variáveis de membro com " this.
", mas em Python " self.
" é sempre necessário. O motivo é que o Python não possui uma sintaxe explícita para declarar variáveis; portanto, não há como saber se x = 7
deve declarar uma nova variável local ou atribuir a uma variável membro. A especificação self.
resolve essa ambiguidade.