以下代码生成错误:
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'
我对此感到惊讶,我希望我的父类有一个方法可以访问其子级保证拥有的私有属性。有没有一些解决这个问题的标准方法?
答案 0 :(得分:9)
您可以使用self._B__something
来访问它。但是,这不是你应该做的。正确的解决方案是将__bar
重命名为_bar
。
double-underscore name mangling背后的想法是避免与子类/超类冲突 - 它并不意味着用于私有变量。如果变量应被视为私有/内部,则在其前面加上一个下划线。这不会导致任何特殊处理,但每个python开发人员都知道它不是包含该变量的类/模块的公共API的一部分。
答案 1 :(得分:1)
它的名字是错误的。任何以双下划线开头的成员都会在Python中损坏名称。您的代码可以与任何其他成员一起使用,只要它们不以双下划线开头。
答案 2 :(得分:-1)
我怀疑你在代码中遗漏了什么......我在A类或B类中看不到__bar ..