Python ではプライベートメソッドはオーバーライドできない

Python で Template Method パターンを使うためにプライベートメソッドをオーバーライドして基底クラスから呼ぼうとしたところ、基底クラスのメソッドがよばれるという現象にいきあたりました。

パブリックメソッドなら派生クラスのメソッドがよばれます。

こうなる原因は Python のプライベートメソッドが本当にプライベートではなくメソッド名をマングリングしているだけだからです。

つまり、Base クラスにて __private_method と記述するとそれは _Base__private_method と読み替えられます。
__private_method をよんでいるつもりが _Base__private_method をよんでいるため、派生クラスのプライベートメソッド _Derived__private_method がよばれることはありません。

結論としては Python ではプライベートメソッドはオーバーライドできないということになります。Template Method パターンを使う場合は抽象メソッドはパブリックメソッドで作成することになります。