_ <parent_class>&LT; __ METHOD_NAME&GT;模式覆盖父项&lt; __ method_name&gt;,为什么?</parent_class>

时间:2012-06-28 10:17:00

标签: python inheritance

我今天看到一个方法覆盖基类中具有不同名称的方法的示例,如何以及为什么这是可能的?它可能有什么用途?

>>> 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

2 个答案:

答案 0 :(得分:3)

哇,真是太可怕了。

这是有效的,因为以双下划线开头的方法 - __bar中的A方法 - 被命名为在Python中模拟“私有”函数的一种非常基本的方式。但它们实际上并不是私有的,它们只是以_classname为前缀。所以编码器在这里利用它来覆盖A中所谓的私有方法。

这有效,但你不应该这样做。 (事实上​​,你几乎不应该使用双下划线的私有属性,但这是一个不同的讨论。)

答案 1 :(得分:3)

这样,类可以具有不会意外地与子类的属性混淆的属性。这很少是必要的,这就是为什么你不经常看到__前缀属性的原因(我经常看到Java程序员滥用它,因为他们认为它做了它不做的事情)。

这段代码不再是打击类的属性。 Python不会阻止你这样做,但是很难找到编写类似代码的好理由