Python _<;家长级><__方法名称>;模式优先于家长<__方法名称>;,为什么?

Python _<;家长级><__方法名称>;模式优先于家长<__方法名称>;,为什么?,python,inheritance,Python,Inheritance,今天我看到了一个方法重写基类中具有不同名称的方法的示例,这是如何实现的,为什么?它可能有什么用途呢 >>> class A(object): ... def foo(self): ... self.__bar() ... def __bar(self): ... print "original" ... >>> class B(A): ... def _A__bar(self): ... print "overridden

今天我看到了一个方法重写基类中具有不同名称的方法的示例,这是如何实现的,为什么?它可能有什么用途呢

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

哇,太可怕了

这是因为以双下划线开头的方法(即
a
中的
\uu bar
方法)在Python中作为模拟“私有”函数的一种非常基本的方法被名称弄乱了。但它们实际上并不是私有的,它们只是以
\u classname
作为前缀。因此,这里的编码人员利用这一点来覆盖A中所谓的私有方法


这是可行的,但你永远不应该这么做。(事实上,无论如何都不应该使用双下划线私有属性,但这是另一种讨论。)

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


这段代码将彻底破坏类的属性。Python不会阻止您这样做,但很难找到一个好的理由来编写这样的代码。

这是由于。@MartijnPieters:我不同意可能的重复。这种行为的原因是名字弄乱了,但问题不同。@MattH:答案大致相同,因为原因是一样的。通过有100个微妙不同的问题和答案,我们正在稀释,使人们更难找到已经存在的答案。@MartijnPieters:子类故意利用名称mangling。在我看来,有人这样做的可能原因与为什么可能有很大不同。@MartijnPieters我想这是类似的,我以前也搜索过,但在你知道这与名称损坏有关(甚至知道名称损坏)之前,很难找到结果-当然,更多的问题更容易找到答案之一?“这很有效,但你永远不应该这样做”-有时候你必须这样做,比如当你不维护基类来自的包时。@bruno我不反对,但我的措辞仍然准确:你不应该这样做。