TransWikia.com

Problema con Python en la encapsulación

Stack Overflow en español Asked by Joaquín Cerutti on January 10, 2021

Para resumir, empecé a programar hace poco, y cuándo llegue a la sección de clases, me crucé con un problema que no he podido solucionar.

Al encapsular variables, se me aparece siempre el mismo problema, el cuál no ocurre si no las encapsulo.

Déjenme mostrarles con un ejemplo simple:

class one():
    def __init__(self):
        self.atributo=3
        

object_1=one()
print(object_1.atributo)

En consola:

3

***Repl Closed***

Como ven, va todo bien. Pero si agrego los guiones para encapsular pasa esto:

class one():
    def __init__(self):
        self.__atributo=3
        

object_1=one()
print(object_1.__atributo)

En consola:

Traceback (most recent call last):
  File "Pruebas 2.py", line 7, in <module>
    print(object_1.__atributo)
AttributeError: 'one' object has no attribute '__atributo'

***Repl Closed***

Según dice, el error está en que el objeto no tiene este atributo; es decir, no me lo detecta.

¿Es algún error a la hora de escribir el código?¿ O simplemente no comprendí bien como usar esta técnica?

2 Answers

Completando la respuesta de @Israel Flores . Para evitar que lleve a confusión. *En python no existen los atributos ni métodos privados, es decir, aunque le pongas la doble barra baja (name mangling), el atributo sigue siendo accesible desde fuera. Ejemplo:

class One():
    def __init__(self):
        self.__atributo=3
       
    def salida(self):
        print(self.__atributo)


class Two(One):
     def __init__(self):
         self.otro_atributo = 5

object_1=One()
object_2 = Two()

object_2.__atributo


object_1.salida()

#Accedemos al atributo llamando al diccionario que tiene la clase
object_1.__dict__['_one__atributo']

#Accedemos a través del objeto que hemos instanciado
object_1._One__atributo

Es decir, el atributo no es realmente privado puesto que es accesible aunque de una forma más complicada. Python está diseñado para que todos lo métodos y atributos sean públicos. Aunque hay distintas convenciones para indicar a los programadores "no debes tocar este método/atributo".

  • _foo: la barra baja, es una convención (realmente más que una convención porque python nunca importará las variables ni funciónes que vayan así escritas) que nos indica que no deberíamos usar este atributo.
  • __foo: la doble barra baja, simplemente nos previene de usar dicho atributo accidentalmente, es decir, es más que un simple aviso, pero como he demostrado antes, el atributo es perfectamente accesible.

*En conclusión en Python a diferencia de otros lenguajes como C++ no existen los atributos privados.

Por último para completar, dejo un video de Raymon Hettinger, explicando este tema, aquí

Answered by Rubiales Alberto on January 10, 2021

No puedes llamar un atributo encapsulado desde fuera de la clase, ya que se convierte en un atributo privado que solamente puedes acceder dentro de la clase .

En dado caso, puedes aplicar el print() dentro de class one() a través de otra función, por ejemplo algo así:

class one():
    def __init__(self):
        self.__atributo=3
       
    def salida(self):
        print(self.__atributo)

object_1=one()
object_1.salida()

Answered by Israel Flores on January 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP