tarde a la fiesta, pero no todos los métodos de pitón son "virtual" por defecto - considerar:
class B(object):
def __priv(self): print '__priv:', repr(self)
def call_private(self):
print self.__class__.__name__
self.__priv()
class E(B):
def __priv(self): super(E, self).__priv()
def call_my_private(self):
print self.__class__.__name__
self.__priv()
B().call_private()
E().call_private()
E().call_my_private()
golpes debido al nombre mangling:
B
__priv: <__main__.B object at 0x02050670>
E
__priv: <__main__.E object at 0x02050670>
E
Traceback (most recent call last):
File "C:/Users/MrD/.PyCharm2016.3/config/scratches/test_double__underscore", line 35, in <module>
E().call_my_private()
File "C:/Users/MrD/.PyCharm2016.3/config/scratches/test_double__underscore", line 31, in call_my_private
self.__priv()
File "C:/Users/MrD/.PyCharm2016.3/config/scratches/test_double__underscore", line 27, in __priv
def __priv(self): super(E, self).__priv()
AttributeError: 'super' object has no attribute '_E__priv'
Así que si quieres Obtenga ayuda del idioma para prohibir que las personas anulen un poco de la funcionalidad que necesita dentro de su clase. Este es el camino a seguir. Si el método que quiere hacer final es parte de su API de clase, sin embargo, está atascado con el enfoque de comentarios (o hacks de metaclass).Mi opinión personal es que una palabra clave final es muy útil para la herencia, ya que se puede evitar romper clases de manera insidiosa cuando se anula (considere usar el método "final" en la implementación súper por ejemplo y luego alguien anula - boom, súper roto) - y para fines de documentación (no hay documentos son mejores que un error de sintaxis en tiempo de compilación) - pero la naturaleza dinámica de Python no lo permitiría y hacks son frágiles - por lo que añadir una cadena de documentación:
"""DON'T OVERRIDE THIS METHOD"""
¿por qué quieres una cosa así? ¿Tienes miedo de que alguien lo anule y no funcionará para ellos? es su problema Pero a veces, ellos saben lo que están haciendo y solo necesitan hacerlo. He gastado tres días para solucionar este tipo de limitación en Java, en Python fueron 20 segundos. – Pablo