Métodos privados en Python

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, in 
    obj1.__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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *