Поздно, но не все методы python по умолчанию являются "виртуальными" - рассмотрим:
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()
Удары из-за искажения имени:
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'
Так что, если вы хотите получить некоторую помощь от языка, чтобы запретить людям переопределять некоторые функциональные возможности, которые вам нужны в вашем классе, это путь. Если метод, который вы хотите сделать final, является частью вашего класса API, вы застряли на подходе с комментариями (или хаке метакласса). Мое личное мнение таково, что последнее ключевое слово очень полезно для наследования - так как вы можете избежать коварного взлома класса при его переопределении (рассмотрите возможность использования, например, метода "final" в супер реализации, а затем кто-то переопределяет - boom, super broken) и для целей документации (никакие документы не лучше, чем синтаксическая ошибка времени компиляции), но динамическая природа Python не позволяет этого, а хаки хрупки - поэтому добавьте строку документации:
"""DON'T OVERRIDE THIS METHOD"""