Python父类访问子私有变量

时间:2012-05-29 22:35:38

标签: python oop class inheritance

以下代码生成错误:

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'

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

3 个答案:

答案 0 :(得分:9)

您可以使用self._B__something来访问它。但是,这不是你应该做的。正确的解决方案是将__bar重命名为_bar

double-underscore name mangling背后的想法是避免与子类/超类冲突 - 它并不意味着用于私有变量。如果变量应被视为私有/内部,则在其前面加上一个下划线。这不会导致任何特殊处理,但每个python开发人员都知道它不是包含该变量的类/模块的公共API的一部分。

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

我怀疑你在代码中遗漏了什么......我在A类或B类中看不到__bar ..