【问题标题】:call private class function in exec() python在 exec() python 中调用私有类函数
【发布时间】:2018-02-27 06:44:13
【问题描述】:

我遇到了一个意外问题。这是简化的代码:

class test():
    def __init__(self,name):
        self.name = name

    def __private(self):
        print(self.name)

    def public(self):
        exec("self.__private()")

obj = test('John')
obj.public()

有谁知道我如何在不删除 exec 语句的情况下使这段代码工作?

【问题讨论】:

  • 这不是私有方法。 Python 中没有“私有”之类的东西。
  • @Ignacio Vazquez-Abrams 如果你像 obj.__private() 那样调用它,它是最接近私有函数的函数,它会返回错误
  • 它不是任何私有的。它不是为了让事情变得私密。这是为了防止在使用多重继承时发生属性名称冲突。
  • @Daan 你试过不带execself.__private() 吗?
  • 你为什么需要exec?这对我来说似乎是一个 XY 问题。

标签: python python-3.x exec


【解决方案1】:

以两个下划线开头且不以两个下划线结尾的属性名称以name mangling为准。

当你这样做时

def __private(self):
    print(self.name)

在类定义中,您实际上创建了一个名为 _<ClassName>__private 的方法。

您仍然可以在类主体中以__private 的身份正常访问它(使用适当的限定符,如self,如果适用),但为了通过execeval 或外部调用它类主体,你必须使用它的全名:

def public(self):
    exec('self._test__private()')

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2013-12-17
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2010-09-06
    • 2014-02-03
    相关资源
    最近更新 更多