10 - Atributos públicos y privados

Lección 10 del curso Python Nivel Avanzado.

Introducción

En la lección anterior vimos cómo crear una clase en Python usando el método de inicialización y cómo agregar a esta clase sus atributos y sus métodos.

En esta lección veremos cómo manejar desde Python lo que se conoce como los atributos públicos y privados, para determinar si podemos acceder y modificar dichos atributos sólo dentro de la clase o también por fuera de ella.

Contenido exclusivo suscriptores

Suscríbete y accede al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

¿Qué es eso de atributo público y privado?

Comencemos entendiendo el concepto de atributo público y privado con un ejemplo.

Volvamos al caso de la clase que creamos en la lección anterior, correspondiente a un producto bancario. Los atributos de esta clase eran cliente (el nombre del cliente) y el saldo disponible en el producto.

Idealmente este último atributo no debería ser modificable por el usuario, sino únicamente a través de los métodos agregar y retirar. Pero en nuestra implementación nada nos impide que directamente podamos acceder al atributo saldo y lo modifiquemos como queramos.

Pero esto no resulta ideal, pues la idea de un producto bancario es que su saldo no pueda ser modificado por el usuario sino que se haga a través de las transacciones.

En algunos lenguajes de programación (como C++ por ejemplo), podemos evitar este acceso declarando el atributo como privado, lo que permite proteger ciertos atributos que no deberían ser modificados externamente y a los cuales deberíamos acceder sólo a través de la clase.

Así que en resumen los atributos pueden ser de tipo:

¿Cómo maneja Python los atributos públicos y privados?

En principio en Python no existen atributos privados, todos son públicos, así que no podríamos proteger ciertos atributos para evitar su acceso/modificación desde fuera de la clase.

Sin embargo, a pesar de que los atributos siempre son públicos Python incorpora algunas alternativas que le permiten a los programadores indicar que un atributo no debería ser modificado por fuera de la clase.

La primera alternativa es agregando un guión de piso antes del nombre del atributo al momento de declarar la clase. Esta convención le indica a un programador que si lo desea puede acceder a _saldo desde fuera de la clase, pero que esto no es recomendable.

Pero si queremos dejar el atributo aún más oculto podemos usar, en lugar de uno, dos guiones de piso al momento de declararlo en la clase. Al usar dos guiones de piso Python genera un acceso dado por el nombre de la clase y luego el nombre del atributo: _NombreClase__nombre_atributo. El atributo sigue siendo de acceso público pero hay que recorrer un camino más largo para llegar hasta el y con esto se deja más explícito aún que es mejor no hacerlo de esta manera sino desde dentro de la clase.

Métodos públicos y privados

Tal como ocurre con los atributos, en el caso de los métodos en Python estos siempre serán públicos. Pero también podemos “ocultarlos” (o dejar explícito que se deberían tratar como privados) usando guiones de piso simples o dobles al momento de declararlos dentro de la clase.

Un ejemplo claro de esto es __init__: es un método público pero al cual NO deberíamos acceder desde fuera de la clase.

Contenido exclusivo suscriptores

Recuerda suscribirte para acceder al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Conclusión

Muy bien ya tenemos claro el concepto de atributos y métodos públicos y privados y hemos visto que en Python todos son de acceso público, aunque existen convenciones como el uso de guiones de piso sencillos y dobles para indicar que deberían ser tratados como privados.

Pero a pesar de estas convenciones en ocasiones resultará necesario acceder aun atributo desde fuera de la clase, para lo cual Python implementa el concepto de “propiedad” una herramienta para controlar de acceso a los atributos de un objeto y de la cual hablaremos en detalle en la próxima lección.

Ver todas las lecciones de este curso