Python で NVI (非仮想インターフェイス) イディオムを試していたところ、プライベート (二重アンダースコア) メソッドが仮想として機能していないように見えることに気付きました。
class A(object):
def a(self):
print "in A.a"
self.b()
self.__b()
self._b()
def _b(self):
print "in A._b"
def __b(self):
print "in A.__b"
def b(self):
print "in A.b"
class B(A):
def __b(self):
print "in B.__b"
def b(self):
print "in B.b"
def _b(self):
print "in B._b"
>>> a=A()
>>> b=B()
>>> a.a()
in A.a
in A.b
in A.__b
in A._b
>>> b.a()
in A.a
in B.b
in A.__b
in B._b
これは、二重下線メソッドの名前マングリングが原因である可能性があると推測していますが、直感に反しています。さらに、Python のドキュメント「(C++ プログラマー向け: Python のすべてのメソッドは事実上仮想です。)」から混乱が生じます。