让我们看看最简单的例子:from dis import dis
class A(object):
def __pick(self):
print "1"
def doitinA(self):
self.__pick()
class B(A):
def __pick(self):
print "2"
def doitinB(self):
self.__pick()
b = B()
b.doitinA() # prints 1
b.doitinB() # prints 2
dis(A.doitinA)
dis(B.doitinB)
拆卸步骤如下:8 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_A__pick)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
15 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_B__pick)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
如您所见,Python会篡改以两个下划线开头的函数名(并访问这些名称!!)包含类名的名称-在本例中是_A__pick和_B__pick)。这意味着定义函数的类决定调用哪个__pick方法。
解决方案很简单,通过删除双下划线来避免伪私有方法。例如,使用_pick,而不是__pick。