requisitos previos –
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. Una clase es un ejemplo de encapsulación, ya que encapsula todos los datos que son funciones miembro, variables, etc.
Ahora, puede haber algunos escenarios en los que necesitemos poner restricciones en algunos métodos de la clase, para que no se pueda acceder a ellos fuera de la clase ni por ninguna subclase. Para implementar esto, entran en juego métodos privados.
Métodos privados
Considere un ejemplo de la vida real, el motor de un automóvil, que se compone de muchas partes, como bujías, válvulas, pistones, etc. Ningún usuario usa estas partes directamente, sino que solo sabe cómo usar las partes que las usan. Para esto se utilizan los métodos privados. Se utiliza para ocultar la funcionalidad interna de cualquier clase del mundo exterior.
Los métodos privados son aquellos métodos a los que no se debe acceder fuera de la clase ni por ninguna clase base. En Python, no existen métodos privados a los que no se pueda acceder excepto dentro de una clase. Sin embargo, para definir un método privado, prefije el nombre del miembro con un guión bajo doble » __ «.
Nota: El __init__
método es un constructor y se ejecuta tan pronto como se crea una instancia de un objeto de una clase.
# Python program to # demonstrate private methods # Creating a Base class class Base: # Declaring public method def fun(self): print("Public method") # Declaring private method def __fun(self): print("Private method") # Creating a derived class class Derived(Base): def __init__(self): # Calling constructor of # Base class Base.__init__(self) def call_public(self): # Calling public method of base class print("\nInside derived class") self.fun() def call_private(self): # Calling private method of base class self.__fun() # Driver code obj1 = Base() # Calling public method obj1.fun() obj2 = Derived() obj2.call_public() # Uncommenting obj1.__fun() will # raise an AttributeError # Uncommenting obj2.call_private() # will also raise an AttributeError
Producción:
Public method Inside derived class Public method
Traceback (most recent call last): File "/home/09d6f91fdb63d16200e172c7a925dd7f.py", line 43, inobj1.__fun() AttributeError: 'Base' object has no attribute '__fun' Traceback (most recent call last): File "/home/0d5506bab8f06cb7c842501d9704557b.py", line 46, in obj2.call_private() File "/home/0d5506bab8f06cb7c842501d9704557b.py", line 32, in call_private self.__fun() AttributeError: 'Derived' object has no attribute '_Derived__fun'
El ejemplo anterior muestra que los métodos privados de la clase no pueden ser accedidos fuera de la clase ni por ninguna clase base. Sin embargo, se puede acceder a los métodos privados llamando a los métodos privados a través de métodos públicos.
Ejemplo:
# Python program to # demonstrate private methods # Creating a class class A: # Declaring public method def fun(self): print("Public method") # Declaring private method def __fun(self): print("Private method") # Calling private method via # another method def Help(self): self.fun() self.__fun() # Driver's code obj = A() obj.Help()
Producción:
Public method Private method
Destrucción de nombres
Python proporciona una varita mágica que también se puede usar para llamar a métodos privados fuera de la clase, se conoce como manipulación de nombres. Significa que cualquier identificador de la forma __geek (al menos dos guiones bajos iniciales o como máximo un guión bajo final) se reemplaza con _classname__geek, donde classname es el nombre de la clase actual sin los guiones bajos iniciales.
Ejemplo:
# Python program to # demonstrate private methods # Creating a class class A: # Declaring public method def fun(self): print("Public method") # Declaring private method def __fun(self): print("Private method") # Driver's code obj = A() # Calling the private member # through name mangling obj._A__fun()
Producción:
Private method
Publicación traducida automáticamente
Artículo escrito por nikhilaggarwal3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA