Python 在导入的类中调用私有方法

Python 在导入的类中调用私有方法,python,python-3.x,class,oop,Python,Python 3.x,Class,Oop,我在一些代码中遇到了一个意外问题,可以用一个更简单的例子来重现: file1.py class FirstClass: def function1(self): print("hello from function1") def __function2(self): print("hello from function2") from file1 import FirstClass fc = FirstClass() fc.function1

我在一些代码中遇到了一个意外问题,可以用一个更简单的例子来重现:

file1.py

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

fc = FirstClass()

fc.function1()

fc.__function2()
file2.py

class FirstClass:
    def function1(self):
        print("hello from function1")
    def __function2(self):
        print("hello from function2")
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'
$python file2.py
您好,来自功能1
回溯(最近一次呼叫最后一次):
文件“file2.py”,第7行,在
功能2()
AttributeError:FirstClass实例没有属性“\uuu function2”

如何才能使对
\u function2
的调用正常工作?我真的不应该进入那个导入的类并将该私有方法公开。

名称以2个下划线字符开头的函数不打算从其类外调用。为了允许用户在子类中重新定义它,每个类调用它的子类(不是正常的方法重写),它的名称被修改为
\u className\u\u methodName

因此,在这里,您确实不应该直接使用它,但如果您确实需要,您应该能够:

fc._FirstClass__function2()

为什么会出人意料?嗯,这是我第一次遇到这种情况,这就是为什么我没有预料到。你可以用
\u头等舱\u函数2
来完成。如果你必须的话。我不在乎健康警告。请参阅此处的私有变量部分:请注意,
def\uu somefunction
不是私有方法,它用于避免名称空间冲突,因为python没有访问的隐私模型。您可以像前面所说的那样做,但您应该这样做吗?有人对该类进行了建模,认为客户端代码不应该访问该“private”属性。