¿Cuál es el beneficio de la mutilación de nombres privados en Python?

Python proporciona nombres privados para los métodos y atributos de clase.

¿Existe algún caso concreto en el que se requiera esta función o solo se transfiera desde Java y C ++?

Por favor, describa un caso de uso en el que se debe usar la manipulación de nombres de Python, si corresponde

Además, no me interesa el caso en el que el autor simplemente está tratando de evitar el acceso accidental a atributos externos. Creo que este caso de uso no está alineado con el modelo de progtwigción de Python.

    Es en parte para evitar el acceso accidental a los atributos internos . Aquí hay un ejemplo:

    En su código, que es una biblioteca:

    class YourClass: def __init__(self): self.__thing = 1 # Your private member, not part of your API 

    En mi código, en el que estoy heredando de su clase de biblioteca:

     class MyClass(YourClass): def __init__(self): # ... self.__thing = "My thing" # My private member; the name is a coincidence 

    Sin la mutilación de nombres privados, mi reutilización accidental de su nombre rompería su biblioteca.

    De la PEP 8 :

    Si su clase está diseñada para ser subclasificada y tiene atributos que no desea que usen las subclases, considere nombrarlos con guiones bajos dobles y sin guiones bajos. Esto invoca el algoritmo de manipulación de nombres de Python, donde el nombre de la clase se transforma en el nombre del atributo. Esto ayuda a evitar colisiones de nombres de atributos en caso de que las subclases contengan inadvertidamente atributos con el mismo nombre.

    (Énfasis añadido)

    Todas las respuestas anteriores son correctas, pero aquí hay otra razón con un ejemplo. Name Mangling es necesario en Python porque para evitar problemas que pueden ser causados ​​por atributos que sobrescriben. En otras palabras, para anular, el intérprete de Python tiene que ser capaz de crear una identificación distinta para el método secundario versus el método primario y el uso de __ (doble guión bajo) permite a python hacer esto. En el siguiente ejemplo, sin __help, este código no funcionaría.

     class Parent: def __init__(self): self.__help("will take child to school") def help(self, activities): print("parent",activities) __help = help # private copy of original help() method class Child(Parent): def help(self, activities, days): # notice this has 3 arguments and overrides the Parent.help() self.activities = activities self.days = days print ("child will do",self.activities, self.days) # the goal was to extend and override the Parent class to list the child activities too print ("list parent & child responsibilities") c = Child() c.help("laundry","Saturdays") 

    El nombre mangling está ahí para evitar el acceso accidental a atributos externos. Sobre todo, está ahí para asegurarse de que no haya conflictos de nombres.