在导入的类中调用私有方法[重复]

Posted

技术标签:

【中文标题】在导入的类中调用私有方法[重复]【英文标题】:call a private method in an imported class [duplicate] 【发布时间】:2019-06-06 13:42:36 【问题描述】:

我在某些代码中遇到了意外问题,可以在更简单的示例中重现它:

file1.py

class FirstClass:
    def function1(self):
        print("hello from function1")
    def __function2(self):
        print("hello from function2")

file2.py

from file1 import FirstClass

fc = FirstClass()

fc.function1()

fc.__function2()

..这就是发生的事情:

$ python file2.py 
hello from function1
Traceback (most recent call last):
  File "file2.py", line 7, in <module>
    fc.__function2()
AttributeError: FirstClass instance has no attribute '__function2'

您可以做些什么来使__function2 的调用有效?我真的不应该进入那个导入的类并公开那个私有方法。

【问题讨论】:

为什么会出乎意料? 嗯,这是第一次发生在我身上,这就是我没想到的原因。 您可以使用_FirstClass__function2 来完成。如果你必须。我不会打扰健康警告。请参阅此处的私有变量部分:docs.python.org/3.7/tutorial/classes.html 注意def __somefunction 不是私有方法,它用于避免命名空间冲突,因为python没有访问的隐私模型 你可以像说的那样做,但你应该这样做吗?有人为该类建模,认为客户端代码不应访问该“私有”属性。 【参考方案1】:

名称以 2 个下划线字符开头的函数不打算从其类外部调用。为了允许用户在子类中重新定义它,每个类都调用它的一个(不是普通方法覆盖),它的名字是mangled_className__methodName

所以在这里,你真的不应该直接使用它,但如果你真的需要,你应该可以这样做:

fc._FirstClass__function2()

【讨论】:

以上是关于在导入的类中调用私有方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java - 从类中调用私有数组列表[重复]

在具有 C++ 中另一个类型的类中声明属性 [重复]

Python中的公共和私有方法[重复]

您可以在 Java 中访问私有变量,而无需来自非内部类的类的 getter [重复]

具有相同名称的函数的类中的多重继承[重复]

Java与Python中的类方法调用(一般OO问题)[重复]