La encapsulación es uno de los conceptos fundamentales en la programación orientada a objetos (POO). Describe la idea de envolver datos y los métodos que funcionan con datos dentro de una unidad. Esto pone restricciones en el acceso directo a variables y métodos y puede evitar la modificación accidental de datos. Para evitar cambios accidentales, la variable de un objeto solo puede cambiarse mediante el método de un objeto. Ese tipo de variables se conocen como variables privadas.
Una clase es un ejemplo de encapsulación, ya que encapsula todos los datos que son funciones miembro, variables, etc.
Considere un ejemplo de encapsulación de la vida real, en una empresa, hay diferentes secciones como la sección de cuentas, la sección de finanzas, la sección de ventas, etc. La sección de finanzas maneja todas las transacciones financieras y mantiene registros de todos los datos relacionados con las finanzas. De manera similar, la sección de ventas maneja todas las actividades relacionadas con las ventas y mantiene registros de todas las ventas. Ahora puede surgir una situación en la que, por alguna razón, un funcionario de la sección de finanzas necesite todos los datos sobre las ventas en un mes en particular. En este caso, no se le permite acceder directamente a los datos de la sección de ventas. Primero tendrá que ponerse en contacto con algún otro oficial en la sección de ventas y luego solicitarle que proporcione los datos particulares. Esto es lo que es la encapsulación. Aquí los datos de la sección de ventas y los empleados que pueden manipularlos están envueltos bajo un solo nombre “sección de ventas”. El uso de la encapsulación también oculta los datos. En este ejemplo, los datos de las secciones como ventas, finanzas o cuentas están ocultos de cualquier otra sección.
miembros protegidos
Los miembros protegidos (en C++ y JAVA) son aquellos miembros de la clase a los que no se puede acceder desde fuera de la clase pero sí desde dentro de la clase y sus subclases. Para lograr esto en Python, simplemente siga la convención al anteponer el nombre del miembro con un solo guión bajo «_» .
Aunque se puede acceder a la variable protegida fuera de la clase, así como en la clase derivada (modificada también en la clase derivada), es habitual (la convención no es una regla) no acceder a la protegida fuera del cuerpo de la clase.
Nota: El método __init__ es un constructor y se ejecuta tan pronto como se crea una instancia de un objeto de una clase.
Python3
# Python program to # demonstrate protected members # Creating a base class class Base: def __init__(self): # Protected member self._a = 2 # Creating a derived class class Derived(Base): def __init__(self): # Calling constructor of # Base class Base.__init__(self) print("Calling protected member of base class: ", self._a) # Modify the protected variable: self._a = 3 print("Calling modified protected member outside class: ", self._a) obj1 = Derived() obj2 = Base() # Calling protected member # Can be accessed but should not be done due to convention print("Accessing protected member of obj1: ", obj1._a) # Accessing the protected variable outside print("Accessing protected member of obj2: ", obj2._a)
Producción:
Calling protected member of base class: 2 Calling modified protected member outside class: 3 Accessing protected member of obj1: 3 Accessing protected member of obj2: 2
miembros privados
Los miembros privados son similares a los miembros protegidos, la diferencia es que los miembros de clase declarados privados no deben ser accedidos fuera de la clase ni por ninguna clase base. En Python, no existen variables de instancia privada a las que no se pueda acceder excepto dentro de una clase.
Sin embargo, para definir un miembro privado, prefije el nombre del miembro con un guión bajo doble «__».
Nota: Se puede acceder a los miembros privados y protegidos de Python fuera de la clase a través de python name mangling .
Python3
# Python program to # demonstrate private members # Creating a Base class class Base: def __init__(self): self.a = "GeeksforGeeks" self.__c = "GeeksforGeeks" # Creating a derived class class Derived(Base): def __init__(self): # Calling constructor of # Base class Base.__init__(self) print("Calling private member of base class: ") print(self.__c) # Driver code obj1 = Base() print(obj1.a) # Uncommenting print(obj1.c) will # raise an AttributeError # Uncommenting obj2 = Derived() will # also raise an AtrributeError as # private member of base class # is called inside derived class
Producción:
GeeksforGeeks
Traceback (most recent call last): File "/home/f4905b43bfcf29567e360c709d3c52bd.py", line 25, in <module> print(obj1.c) AttributeError: 'Base' object has no attribute 'c' Traceback (most recent call last): File "/home/4d97a4efe3ea68e55f48f1e7c7ed39cf.py", line 27, in <module> obj2 = Derived() File "/home/4d97a4efe3ea68e55f48f1e7c7ed39cf.py", line 20, in __init__ print(self.__c) AttributeError: 'Derived' object has no attribute '_Derived__c'
Publicación traducida automáticamente
Artículo escrito por nikhilaggarwal3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA