1) ¿Por qué se selfrequiere como parámetro explícito en las firmas de métodos?
Porque los métodos son funciones y foo.bar(baz)solo es azúcar sintáctica bar(foo, baz). Las clases son solo diccionarios donde algunos de los valores son funciones. (Los constructores también son solo funciones, por lo que Python no necesita new). Puede decir que Python hace explícito que los objetos se crean a partir de componentes más simples. Esto está de acuerdo con la filosofía "explícito es mejor que implícito".
En contraste, en Java los objetos son realmente mágicos y no pueden reducirse a componentes más simples en el lenguaje. En Java (al menos hasta Java 8), una función siempre es un método propiedad de un objeto, y esta propiedad no se puede cambiar debido a la naturaleza estática del lenguaje. Por lo tanto, no hay ambigüedad sobre lo que se thisrefiere, por lo que tiene sentido tenerlo implícitamente definido.
JavaScript es un ejemplo de un lenguaje que tiene un lenguaje implícito thiscomo Java, pero donde las funciones pueden existir por separado de los objetos como en Python. Esto lleva a mucha confusión sobre lo que se thisrefiere a cuando las funciones se pasan y se llaman en diferentes contextos. Muchos piensan instintivamente que thisdeben referirse a alguna propiedad intrínseca de la función, mientras que en realidad está puramente determinada por la forma en que se llama a la función. Creo que tener thisun parámetro explícito como en Python haría esto mucho menos confuso.
Algunos otros beneficios del selfparámetro explícito :
Los decoradores son solo funciones que envuelven otras funciones. Como los métodos son solo funciones, los decoradores funcionan igual de bien en los métodos. Si hubiera algún tipo de yo implícito, los decoradores no funcionarían de manera transparente en los métodos.
Los métodos de clase y los métodos estáticos no toman un parámetro de instancia. Los métodos de clase toman una clase como primer argumento (típicamente llamado cls). El explícito selfo los clsparámetros aclaran mucho más lo que está sucediendo y a qué tiene acceso en el método.
2) ¿Por qué las variables de instancias siempre deben calificarse con " self.?
En Java, no necesita prefijar las variables miembro con " this.", pero en Python " self." siempre es necesario. La razón es que Python no tiene una sintaxis explícita para declarar variables, por lo que no habría forma de saber si x = 7se supone que debe declarar una nueva variable local o asignarla a una variable miembro. Especificar self.resuelve esta ambigüedad.