He estado aprendiendo Python siguiendo algunos tutoriales de pygame .
Allí encontré un uso extenso de la palabra clave self , y viniendo de un fondo principalmente de Java, encuentro que sigo olvidando escribir self . Por ejemplo, en lugar de self.rect.centerx
escribir rect.centerx
, porque, para mí, rect ya es una variable miembro de la clase.
El paralelo de Java en el que puedo pensar para esta situación es tener que prefijar todas las referencias a las variables miembro con esto .
¿Estoy atascado con el prefijo de todas las variables miembro con self , o hay alguna forma de declararlas que me permita evitar tener que hacerlo?
Incluso si lo que sugiero no es pitónico , me gustaría saber si es posible.
He echado un vistazo a estas preguntas SO relacionadas, pero no responden lo que busco:
m_
prefijo para todos los nombres de miembros observados por algunos programadores de C ++ / Java? El uso deself.
ayuda a la legibilidad de manera similar. Además, debe leer dirtsimple.org/2004/12/python-is-not-java.html .m_
se usa solo para miembros de datos no públicos no estáticos (al menos en C ++).mVariableName
, para las variables miembro, al codificar en Java. Creo que el comentario de @ Anurag lo resume bastante bien, por lo que un desarrollador de Java debe hacer al aprender Python.Respuestas:
Python requiere especificarse a sí mismo. El resultado es que nunca hay confusión sobre qué es un miembro y qué no, incluso sin la definición de clase completa visible. Esto lleva a propiedades útiles, como: no puede agregar miembros que accidentalmente sombrean a los no miembros y, por lo tanto, rompen el código.
Un ejemplo extremo: puede escribir una clase sin saber qué clases base podría tener, y siempre saber si está accediendo a un miembro o no:
Ese es el código completo ! (alguna_función devuelve el tipo utilizado como base).
Otro, donde los métodos de una clase se componen dinámicamente:
Recuerde, ambos ejemplos son extremos y no los verá todos los días, ni le sugiero que a menudo escriba un código como este, pero muestran claramente aspectos de ser requeridos explícitamente.
fuente
self
.__shadow__ myFieldName
. Eso también evitaría el sombreado accidental, ¿no?Las respuestas anteriores son básicamente variantes de "no puedes" o "no deberías". Si bien estoy de acuerdo con el último sentimiento, la pregunta técnicamente aún no tiene respuesta.
Además, existen razones legítimas por las cuales alguien podría querer hacer algo similar a lo que se está haciendo la pregunta real. Una cosa con la que me encuentro a veces son las largas ecuaciones matemáticas donde el uso de nombres largos hace que la ecuación sea irreconocible. Aquí hay un par de formas de cómo podría hacer esto en un ejemplo enlatado:
El tercer ejemplo, es decir, usar
for k in self.__dict__ : exec(k+'= self.'+k)
es básicamente lo que la pregunta realmente está pidiendo, pero permítanme aclarar que no creo que sea una buena idea.Para obtener más información y formas de iterar a través de variables de clase, o incluso funciones, vea las respuestas y la discusión de esta pregunta . Para una discusión sobre otras formas de nombrar dinámicamente variables, y por qué esto generalmente no es una buena idea, vea esta publicación de blog .
ACTUALIZACIÓN: Parece que no hay forma de actualizar dinámicamente o cambiar locales en una función en Python3, por lo que calc3 y variantes similares ya no son posibles. La única solución compatible con python3 que se me ocurre ahora es usar
globals
:Lo cual, nuevamente, sería una práctica terrible en general.
fuente
locals
lugar de usarexec
?locals().update(self.__dict__)
en Python 2 y 3, pero no funcionó. En python3, incluso el truco 'exec' ya no es una opción. Por otro lado,globals().update(self.__dict__)
funciona, pero sería una práctica terrible en general.En realidad
self
no es una palabra clave, es solo el nombre dado convencionalmente al primer parámetro de los métodos de instancia en Python. Y ese primer parámetro no se puede omitir, ya que es el único mecanismo que tiene un método para saber en qué instancia de su clase se está llamando.fuente
Puedes usar el nombre que quieras, por ejemplo
o incluso
pero está atrapado con el uso de un nombre para el alcance.
No recomiendo que uses algo diferente a ti mismo a menos que tengas una razón convincente, ya que lo haría extraño para los pitonistas experimentados.
fuente
self
, y debe seguir la convención. Hará que su código sea más fácil de entender para cualquier programador experimentado de Python que lo vea. (Esto incluye, dentro de seis meses, tratando de averiguar lo que hace su programa de edad!)def function(_, variable): _.variable = variable
def funcion(*args): args[0].variable = args[1]
Sí, siempre debe especificar
self
, porque explícito es mejor que implícito, de acuerdo con la filosofía de Python.También descubrirá que la forma en que programa en python es muy diferente de la forma en que programa en java, por lo tanto, el uso de
self
tiende a disminuir porque no proyecta todo dentro del objeto. Más bien, hace un mayor uso de la función de nivel de módulo, que se puede probar mejor.por cierto. Al principio lo odiaba, ahora odio lo contrario. lo mismo para el control de flujo impulsado por sangría.
fuente
self
de ninguna manera. Entonces, ¿qué sentido tiene tenerlos en la clase?El "self" es el marcador de posición convencional de la instancia de objeto actual de una clase. Se utiliza cuando desea hacer referencia a la propiedad, el campo o el método del objeto dentro de una clase como si se estuviera refiriendo a "sí mismo". Pero para acortar, alguien en el ámbito de la programación de Python comenzó a usar "self", otros reinos usan "this" pero lo hacen como una palabra clave que no puede ser reemplazada. Prefiero usar "its" para aumentar la legibilidad del código. Es una de las cosas buenas de Python: tiene la libertad de elegir su propio marcador de posición para la instancia del objeto que no sea "self". Ejemplo para uno mismo:
Ahora reemplazamos 'self' con 'its':
¿Cuál es más legible ahora?
fuente
s
(o alguna otra letra) en lugar deits
s
tiene el mismo significado: un alias para la instancia de clase. tendría que buscar lo queits
significa en el contexto de la misma maneraself es parte de la sintaxis de python para acceder a los miembros de los objetos, así que me temo que te quedas atascado
fuente
En realidad, puedes usar la receta "Yo implícito" de la presentación de Armin Ronacher "5 años de malas ideas" (google it).
Es una receta muy inteligente, como casi todo de Armin Ronacher, pero no creo que esta idea sea muy atractiva. Creo que preferiría explícitamente esto en C # / Java.
Actualizar. Enlace a "receta de mala idea": https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58
fuente
def method(
<del> self </del>)
, peroself.variable
aún es necesario con este truco inteligente.Sí, el auto es tedioso. Pero, ¿es mejor?
fuente
_
tiene un significado especial en el shell de Python, donde contiene el último valor devuelto. Es seguro usarlo así, pero potencialmente confuso; Lo evitarías
, om
(a C ++ mímica)De: Self Hell - Más funciones con estado.
fuente
__str__
y similares) ya que estos se invocan de una manera diferente a los métodos normales.Creo que sería más fácil y más legible si hubiera una declaración "miembro", así como "global", para que pueda decirle al intérprete cuáles son los objetos miembros de la clase.
fuente