【问题标题】:Python parent class access to child private variablesPython父类访问子私有变量
【发布时间】:2012-06-04 04:20:37
【问题描述】:

以下代码会产生错误:

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'

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

【问题讨论】:

标签: python oop class inheritance


【解决方案1】:

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

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

【讨论】:

  • 没错。名称修改机制的目的是准确获取 OP 在此处看到的行为。它旨在使成员元素链接到 1 个且仅 1 个范围。
  • 知道了。我发现你在这里说的同样的事情docs.python.org/tutorial/classes.html 我想我对没有什么是真正私密的想法仍然有点不舒服。
  • 好吧,即使在具有“真实”私有变量的语言中,也总是有方法(反射或弄乱内存)来访问它们。 Python 只是假设程序员很聪明,所以它并没有真正强制执行私有变量。
【解决方案2】:

我怀疑你的代码中遗漏了一些东西。我在 A 类或 B 类中都没有看到 __bar。

【讨论】:

  • 在 StackOverflow 上,我们使用正确的英语,即“you”和“are”而不是“u”和“r”。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 2011-04-08
    • 1970-01-01
    • 2011-11-05
    • 2018-10-28
    • 2015-09-25
    • 2020-12-11
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多