2

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

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

2 回答 2

3

哇,这真的太可怕了。

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

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

于 2012-06-28T10:22:35.373 回答
3

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

这段代码不适合抨击类的属性。Python 不会阻止你这样做,但很难找到编写这样的代码的充分理由

于 2012-06-28T10:26:29.443 回答