El encapsulamiento y el peligro de los atributos y m茅todos p煤blicos

Encapsulamiento en programaci贸n

El encapsulamiento o encapsulaci贸n en programaci贸n es un concepto relacionado con la programaci贸n orientada a objetos, y hace referencia al ocultamiento de los estado internos de una clase al exterior. Dicho de otra manera, encapsular consiste en hacer que los atributos o m茅todos internos a una clase no se puedan acceder ni modificar desde fuera, sino que tan solo el propio objeto pueda acceder a ellos.

Para la gente que conozca Java, le resultar谩 un termino muy familiar, pero en Python es algo distinto. Digamos que Python por defecto no oculta los atributos y m茅todos de una clase al exterior. Veamos un ejemplo con el lenguaje Python.

class Clase:
    atributo_clase = "Hola"
    def __init__(self, atributo_instancia):
        self.atributo_instancia = atributo_instancia

mi_clase = Clase("Que tal")
mi_clase.atributo_clase
mi_clase.atributo_instancia

# 'Hola'
# 'Que tal'

Ambos atributos son perfectamente accesibles desde el exterior. Sin embargo esto es algo que tal vez no queramos. Hay ciertos m茅todos o atributos que queremos que pertenezcan s贸lo a la clase o al objeto, y que s贸lo puedan ser accedidos por los mismos. Para ello podemos usar la doble __ para nombrar a un atributo o m茅todo. Esto har谩 que Python los interprete como "privados", de manera que no podr谩n ser accedidos desde el exterior.

class Clase:
    atributo_clase = "Hola"   # Accesible desde el exterior
    __atributo_clase = "Hola" # No accesible

    # No accesible desde el exterior
    def __mi_metodo(self):
        print("Haz algo")
        self.__variable = 0

    # Accesible desde el exterior
    def metodo_normal(self):
        # El m茅todo si es accesible desde el interior
        self.__mi_metodo()

mi_clase = Clase()
#mi_clase.__atributo_clase  # Error! El atributo no es accesible
#mi_clase.__mi_metodo()     # Error! El m茅todo no es accesible
mi_clase.atributo_clase     # Ok!
mi_clase.metodo_normal()    # Ok!

Y como curiosidad, podemos hacer uso de dir para ver el listado de m茅todos y atributos de nuestra clase. Podemos ver claramente como tenemos el metodo_normal y el atributo de clase, pero no podemos encontrar __mi_metodo ni __atributo_clase.

print(dir(mi_clase))
#['_Clase__atributo_clase', '_Clase__mi_metodo', '_Clase__variable',
#'__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
#'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
#'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
#'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
#'__str__', '__subclasshook__', '__weakref__', 'atributo_clase', 'metodo_normal']

Pues bien, en realidad si que podr铆amos acceder a __atributo_clase y a __mi_metodo haciendo un poco de trampa. Aunque no se vea a simple vista, si que est谩n pero con un nombre distinto, para de alguna manera ocultarlos y evitar su uso. Pero podemos llamarlos de la siguiente manera, pero por lo general no es una buena idea.

mi_clase._Clase__atributo_clase
# 'Hola'
mi_clase._Clase__mi_metodo()
# 'Haz algo'

Existen otros conceptos muy importantes y relacionados con la programaci贸n orientada a objetos. Aqu铆 te los dejamos:

¡Deja un comentario!

avatar
  Subscribe  
Notify of