迟到了,但并不是所有的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