Las clases de Python no tienen ningún concepto de público/privado, por lo que se nos dice que no toquemos algo que comience con un guión bajo a menos que lo hayamos creado. ¿Pero esto no requiere un conocimiento completo de todas las clases de las cuales heredamos, directa o indirectamente? Testigo:¿Requiere Python un conocimiento profundo de todas las clases en la cadena de herencia?
class Base(object):
def __init__(self):
super(Base, self).__init__()
self._foo = 0
def foo(self):
return self._foo + 1
class Sub(Base):
def __init__(self):
super(Sub, self).__init__()
self._foo = None
Sub().foo()
era de esperar, un TypeError
se eleva cuando se evalúa None + 1
. Así que tengo que saber que existe _foo
en la clase base. Para evitar esto, se puede usar __foo
en su lugar, lo que soluciona el problema modificando el nombre. Esto parece ser, si no elegante, una solución aceptable. Sin embargo, ¿qué ocurre si Base
hereda de una clase (en un paquete separado) llamado Sub
? Ahora __foo
en mi Sub
anula __foo
en el abuelo Sub
.
Esto implica que tengo que conocer toda la cadena de herencia, incluidos todos los objetos "privados" que utiliza cada uno. El hecho de que Python sea de tipo dinámico lo hace aún más difícil, ya que no hay declaraciones para buscar. La peor parte, sin embargo, es probablemente el hecho de que Base
podría heredar desde object
en este momento, pero en una versión futura, cambiará a heredar de Sub
. Claramente, si sé que Sub
se hereda de, puedo cambiar el nombre de mi clase, por muy molesto que sea. Pero no puedo ver el futuro.
¿No es este un caso en el que un tipo de datos privados podría evitar un problema? ¿Cómo, en Python, puedo estar seguro de que no pisaré accidentalmente los dedos de los pies si esos dedos podrían surgir en algún momento en el futuro?
EDIT: Al parecer, no he dejado clara la pregunta principal. Estoy familiarizado con el cambio de nombre y la diferencia entre un subrayado simple y doble. La pregunta es: ¿cómo puedo lidiar con el hecho de que podría chocar con las clases cuya existencia no conozco en este momento? Si mi clase padre (que está en un paquete que no escribí) pasa a heredar de una clase con el mismo nombre que mi clase, incluso el cambio de nombre no ayudará. ¿Me equivoco al ver esto como un caso (esquina) que los verdaderos miembros privados resolverían, pero que Python tiene problemas con?
EDITAR: Conforme a lo solicitado, el siguiente es un ejemplo completo:
Archivo parent.py
:
class Sub(object):
def __init__(self):
self.__foo = 12
def foo(self):
return self.__foo + 1
class Base(Sub):
pass
Archivo sub.py
:
import parent
class Sub(parent.Base):
def __init__(self):
super(Sub, self).__init__()
self.__foo = None
Sub().foo()
se llama de foo
El abuelo, pero mi __foo
se usa.
Obviamente, usted no escribiría código como este usted mismo, pero parent
podría ser facilitado por un tercero, cuyos detalles podrían cambiar en cualquier momento.
¿Puedes publicar un ejemplo para demostrar que la otra clase con el mismo nombre no sombrea completamente tu clase existente? ... o tal vez todavía no entiendo ... nunca mencioné ... hice una y tu derecha supongo que esta es una esquina caso ... solo trato de no usar los nombres privados comunes de var/class, supongo –