5

以下代码生成错误:

class A(object):
    def say_something(self):
        print(self.foo)
        print(self.__bar)

class B(A):
    def __init__(self):
        self.foo = 'hello'
        self.__bar = 'world'

test = B()
test.say_something()

'hello' 打印成功,但 'world' 生成以下错误:

    print(self.__bar)

AttributeError:“B”对象没有属性“_A__bar”

我对此感到惊讶,我希望我的父类有一个可以访问其子级保证拥有的私有属性的方法。有没有解决这个问题的标准方法?

4

3 回答 3

12

您可以使用self._B__something它来访问它。然而,这不是你应该做的。正确的解决方案是重命名__bar_bar.

双下划线名称修饰背后的想法是避免与子类/超类发生冲突——它并不意味着用于私有变量。如果应将变量视为私有/内部变量,请在其前面加上一个下划线。这不会引起任何特殊处理,但每个 python 开发人员都会知道它不是包含该变量的类/模块的公共 API 的一部分。

于 2012-05-29T22:39:04.817 回答
1

就是名字改写。任何以双下划线开头的成员都会在 Python 中被破坏名称。您的代码可以与任何其他成员一起使用,只要它们不以双下划线开头。

于 2012-05-29T22:40:19.350 回答
-1

我怀疑您的代码中缺少某些内容..我在 A 类或 B 类中都没有看到 __bar ..

于 2012-05-29T22:39:35.547 回答