Variables privadas en Python

Requisito previo: subrayado en Python
En Python, no existen variables de instancia «privadas» a las que no se pueda acceder excepto dentro de un objeto. Sin embargo, la mayoría de los codificadores y códigos de Python siguen una convención, es decir, un nombre con un prefijo de subrayado. Por ejemplo, _geek debe tratarse como una parte no pública de la API o cualquier código de Python, ya sea una función, un método. o un miembro de datos. Mientras revisamos esto, también intentaremos comprender el concepto de varias formas de guiones bajos finales , por ejemplo, para _ en rango (10), __init__(self). 
 

Mangling y cómo funciona

En Python, hay algo llamado manipulación de nombres, lo que significa que hay un soporte limitado para un caso de uso válido para miembros privados de clase, básicamente para evitar conflictos de nombres con nombres definidos por subclases. 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. Siempre que ocurra dentro de la definición de la clase, esta manipulación está hecha. Esto es útil para permitir que las subclases anulen los métodos sin interrumpir las llamadas a métodos intraclase. 
Veamos este ejemplo e intentemos averiguar cómo funciona este guión bajo: 
 

Python

# Python code to illustrate how mangling works
class Map:
    def __init__(self, iterate):
        self.list = []
        self.__geek(iterate)
    def geek(self, iterate):
        for item in iterate:
            self.list.append(item)
 
    # private copy of original geek() method
    __geek = geek  
 
class MapSubclass(Map):
     
    # provides new signature for geek() but
    # does not break __init__()
    def geek(self, key, value):       
        for i in zip(keys, value):
            self.list.append(i)

Las reglas de manipulación están diseñadas principalmente para evitar accidentes, pero aún es posible acceder o modificar una variable que se considera privada. Esto incluso puede ser útil en circunstancias especiales, como en el depurador.
 

_Guiones bajos iniciales simples

Entonces, básicamente, un subrayado al comienzo de un método, función o miembro de datos significa que no debe acceder a este método porque no es parte de la API. Veamos este fragmento de código: 

Python

# Python code to illustrate
# how single underscore works
def _get_errors(self):
    if self._errors is None:
        self.full_clean()
    return self._errors
 
errors = property(_get_errors)

El fragmento se toma del código fuente de Django (django/forms/forms.py). Esto sugiere que los errores son propiedad y también forman parte de la API, pero el método, _get_errors, es «privado», por lo que no se debe acceder a él.
 

__Guiones bajos iniciales dobles

Dos subrayados, al principio, causan mucha confusión. Se trata de sintaxis en lugar de una convención. El doble guión bajo alterará los nombres de atributos de una clase para evitar conflictos de nombres de atributos entre clases. Por ejemplo: 

Python

# Python code to illustrate how double
# underscore at the beginning works
class Geek:
    def _single_method(self):
        pass
    def __double_method(self): # for mangling
        pass
class Pyth(Geek):
    def __double_method(self): # for mangling
        pass

__Guiones bajos dobles iniciales y dobles finales__

Hay otro caso de guiones bajos dobles iniciales y finales. Seguimos esto mientras usamos variables o métodos especiales (llamados «método mágico») como __len__, __init__. Estos métodos proporcionan características sintácticas especiales a los nombres. Por ejemplo, __file__ indica la ubicación del archivo Python, __eq__ se ejecuta cuando se ejecuta una expresión == b. 
 

Ejemplo:  

Python

# Python code to illustrate double leading and
# double trailing underscore works
class Geek:
 
    # '__init__' for initializing, this is a
    # special method 
    def __init__(self, ab):
        self.ab = ab
 
    # custom special method. try not to use it
    def __custom__(self):
        pass

Este artículo es una contribución de Chinmoy Lenka . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 
Me he referido a Python Docs, hackernoon.com e igorsobreira.com.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *