1) ¿Por qué se self
requiere 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 this
refiere, por lo que tiene sentido tenerlo implícitamente definido.
JavaScript es un ejemplo de un lenguaje que tiene un lenguaje implícito this
como 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 this
refiere a cuando las funciones se pasan y se llaman en diferentes contextos. Muchos piensan instintivamente que this
deben 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 this
un parámetro explícito como en Python haría esto mucho menos confuso.
Algunos otros beneficios del self
pará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 self
o los cls
pará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 = 7
se supone que debe declarar una nueva variable local o asignarla a una variable miembro. Especificar self.
resuelve esta ambigüedad.