1) Por que é selfexigido 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 thisse refere, portanto, faz sentido tê-lo definido implicitamente.
JavaScript é um exemplo de uma linguagem implícita thiscomo Java, mas onde funções podem existir separadamente de objetos como em Python. Isso leva a muita confusão sobre o que thisse refere a quando funções são passadas e chamadas em diferentes contextos. Muitos pensam instintivamente que thisdevem 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 thiscomo parâmetro explícito como em Python tornaria isso muito menos confuso.
Alguns outros benefícios do selfparâ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 selfou clstorna 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 = 7deve declarar uma nova variável local ou atribuir a uma variável membro. A especificação self.resolve essa ambiguidade.