La encapsulación es uno de los principios fundamentales de la programación orientada a objetos, y se refiere a la idea de que los datos y métodos de un objeto deben estar protegidos y no deben ser accesibles directamente desde fuera del objeto. En Python, la encapsulación se logra utilizando convenciones de nomenclatura y, en el caso de las propiedades, mediante el uso de decoradores como @property.
A continuación, se presenta una explicación detallada sobre la encapsulación en Python:
_) al comienzo de un nombre de atributo o método para indicar que es un atributo o método privado, es decir, que no debería ser accedido directamente desde fuera de la clase. Aunque no hay restricciones técnicas para acceder a estos atributos o métodos, se considera una buena práctica no hacerlo. Por ejemplo:class MiClase: def __init__(self): self._atributo_privado = 10 def _metodo_privado(self): pass
@property: En Python, el decorador @property se utiliza para crear un método getter para acceder a un atributo privado como si fuera una propiedad pública. El método getter se denomina como la propiedad que se desea acceder y se define utilizando el decorador @property. Por ejemplo:class MiClase: def __init__(self): self._atributo_privado = 10 @property def atributo_publico(self): return self._atributo_privado
En este ejemplo, el atributo _atributo_privado es un atributo privado, pero se puede acceder a él desde fuera de la clase utilizando el método getter atributo_publico. Por ejemplo:
objeto = MiClase() print(objeto.atributo_publico) # Output: 10
@atributo_publico.setter: En Python, también se puede utilizar el decorador @atributo_publico.setter para crear un método setter que permita modificar un atributo privado a través de una sintaxis similar a la asignación de una propiedad. El método setter se denomina como la propiedad que se desea modificar y se define utilizando el decorador @atributo_publico.setter. Por ejemplo:class MiClase: def __init__(self): self._atributo_privado = 10 @property def atributo_publico(self): return self._atributo_privado @atributo_publico.setter def atributo_publico(self, nuevo_valor): self._atributo_privado = nuevo_valor
En este ejemplo, el método setter atributo_publico permite modificar el atributo _atributo_privado utilizando una sintaxis similar a la asignación de una propiedad. Por ejemplo:
objeto = MiClase() objeto.atributo_publico = 20 print(objeto.atributo_publico) # Output: 20
_), se puede hacer uso de métodos y atributos privados en Python. Aunque técnicamente no hay restricciones de acceso, se considera una convención que los métodos y atributos que comienzan con dos guiones bajos (__) sean tratados como privados y no sean accedidos directamente desde fuera de la clase. Sin embargo, Python utiliza una técnica llamada name mangling para cambiar el nombre de estos atributos y métodos privados a nivel interno. Por ejemplo:class MiClase: def __init__(self): self.__atributo_privado = 10 def __metodo_privado(self): pass
En este ejemplo, el atributo __atributo_privado y el método __metodo_privado son privados, pero Python los renombra internamente utilizando el nombre de la clase que los contiene para evitar conflictos con clases derivadas. Por ejemplo, el atributo __atributo_privado se renombraría a _MiClase__atributo_privado internamente.
Nicolas Alpargatero
EstudianteJhon Freddy Tavera Blandon
EstudianteWaldir Zapata Garcia
EstudianteÁngel Sabillón
EstudianteNadie lo preguntó, ni tampoco lo colocan en recursos como los anteriores temas, pero este curso tiene un módulo de decoradores con POO: .
https://platzi.com/clases/1378-python-practico/14176-decoradores0075/
. El curso es de los mejores solo se lo tira el ultimo modulo 😅
La encapsulación es uno de los principios fundamentales de la programación orientada a objetos que nos permite proteger los datos y comportamientos internos de un objeto, evitando que sean accesibles y modificables desde fuera de la clase. En Python, la encapsulación se logra mediante el uso de convenciones de nomenclatura y el uso de métodos getters y setters.
class Car: def __init__(self, brand, model, year): self._brand = brand self._model = model self._year = year self._speed = 0
Hay que tener en cuenta, que los metodos privados se acceden con GET y SET, y esto es muy usado en c++ y en java.
#ejemplo 02 de encapsulamiento class Clase: #__mi_atributo es un atributo privado def __init__(self, mi_atributo): self.__mi_atributo = mi_atributo # metodo get @property def mi_atributo(self): return self.__mi_atributo # metodo set @mi_atributo.setter def mi_atributo(self, valor): if valor != "": print("Modificando el valor") self.__mi_atributo = valor else: print("Error está vacío") # ejecucion para la clase 02 mi_clase = Clase("valor_atributo") print(mi_clase.mi_atributo) #Output: 'valor_atributo' mi_clase.mi_atributo = "nuevo_valor" print(mi_clase.mi_atributo) #Output: 'nuevo_valor' mi_clase.mi_atributo = "" #Output: Error está vacío
En Python, un guion bajo (_) al inicio de un atributo o método indica que es privado y no debería ser accedido directamente desde fuera de la clase, aunque no hay restricciones técnicas. Por otro lado, dos guiones bajos (__) desencadenan el name mangling, que cambia el nombre del atributo o método en el ámbito interno para evitar conflictos en clases derivadas. Por ejemplo, __atributo se convierte en _NombreClase__atributo. Esta técnica proporciona un nivel adicional de encapsulamiento.