我今天看到一个方法覆盖基类中具有不同名称的方法的示例,如何以及为什么这是可能的?它可能有什么用途?
>>> class A(object):
... def foo(self):
... self.__bar()
... def __bar(self):
... print "original"
...
>>> class B(A):
... def _A__bar(self):
... print "overridden"
...
>>> B().foo()
overridden
答案 0 :(得分:3)
这是有效的,因为以双下划线开头的方法 - __bar
中的A
方法 - 被命名为在Python中模拟“私有”函数的一种非常基本的方式。但它们实际上并不是私有的,它们只是以_classname
为前缀。所以编码器在这里利用它来覆盖A中所谓的私有方法。
这有效,但你不应该这样做。 (事实上,你几乎不应该使用双下划线的私有属性,但这是一个不同的讨论。)
答案 1 :(得分:3)
这样,类可以具有不会意外地与子类的属性混淆的属性。这很少是必要的,这就是为什么你不经常看到__
前缀属性的原因(我经常看到Java程序员滥用它,因为他们认为它做了它不做的事情)。
这段代码不再是打击类的属性。 Python不会阻止你这样做,但是很难找到编写类似代码的好理由