遲到了,但並不是所有的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'
所以,如果你想從語言中獲得一些幫助,以禁止人們重寫你在課堂中需要的一些功能,這是要走的路。如果你想做最終的方法是你的類API的一部分,但你堅持使用評論方法(或metaclass hacks)。我個人的觀點是最終的關鍵字對於繼承是非常有用的,因爲你可以避免類在被覆蓋時以陰險的方式破壞(例如考慮在超級實現中使用「最終」方法,然後有人覆蓋 - 繁榮,超級破壞) - 和文檔的目的(不文檔是不是編譯時語法錯誤更好) - 但是Python的動態特性不會允許它和黑客都是脆弱的 - 那麼添加文檔字符串:
"""DON'T OVERRIDE THIS METHOD"""
爲什麼你想這樣的事情?你害怕有人會重寫它,它不會爲他們工作嗎?這是他們的問題。但有時候,他們知道他們在做什麼,他們只需要做。我花了三天的時間解決了Java中的這種限制,在Python中是20秒。 – Pablo 2008-11-26 16:01:59