Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

250
Vistas
¿Por qué Python está destrozando aquí?

¿Por qué falla este código si no hay cls. antes de __TEXTO

 __TEXT = "abcde" print(__TEXT) class aaa(): @classmethod def bbb(cls): print(__TEXT) aaa.bbb()

La salida es:

 abcde Traceback (most recent call last): File "<string>", line 9, in <module> File "<string>", line 7, in bbb NameError: name '_aaa__TEXT' is not defined

Si convierte a __TEXT en una variable de clase e intenta hacer referencia a ella sin el prefijo de clase de la siguiente manera:

 class aaa(): __TEXT = "abcde" @classmethod def bbb(cls): print(cls.__TEXT) print(__TEXT) x = aaa() x.bbb()

Obtienes el mismo error pero no tiene sentido:

 abcde Traceback (most recent call last): File "<string>", line 10, in <module> File "<string>", line 7, in bbb NameError: name '_aaa__TEXT' is not defined
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

En PEP 8 , específicamente dicen:

__double_leading_underscore: al nombrar un atributo de clase, invoca la manipulación de nombres ( dentro de la clase FooBar, __boo se convierte en _FooBar__boo ...).

Observe la selección en negrita. Exactamente en la misma oración en la que llaman la atención sobre el uso de mangling para nombrar atributos de clase, afirman que el mangling le sucede a cualquier __boo dentro de la clase, lo que explica perfectamente lo que estás observando.

over 4 years ago · Santiago Trujillo Denunciar

0

No estoy muy seguro de si ese fue el error, pero puede hacer que la función requiera un texto de parámetro, eso parece funcionar bien. Sin embargo, necesita darme más información para que pueda tratar de ayudar.

 __TEXT = "abcde" print(__TEXT) class aaa(): @classmethod def bbb(self, __TEXT): print(__TEXT) aaa.bbb(__TEXT)
over 4 years ago · Santiago Trujillo Denunciar

0

Un prefijo de subrayado doble hace que el intérprete de Python reescriba el nombre del atributo para evitar conflictos de nombres en las subclases.

Esto también se llama "destrucción de nombres". El intérprete cambia el nombre de la variable de una manera que dificulta la creación de colisiones cuando la clase se amplía más adelante.

Documentos de referencia: https://docs.python.org/3/tutorial/classes.html#private-variables

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda