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