私は通常、保護された (C++ のように) メソッド/属性などに単一のアンダースコアを使用_myvar
します。これは、派生クラスで使用でき__var
、他の人が使用しない場合などに二重アンダースコアを使用できます。また、クラス定義レベルでの二重アンダースコアの名前はmangledであるため、派生クラスでオーバーライドすることはできません。
class A(object):
def result1(self): # public method
return self._calc1()
def result2(self): # public method
return self.__calc2()
def _calc1(self): # protected method, can be overridden in derived class
return 'a1'
def __calc2(self): # private can't be overridden
return 'a2'
class B(A):
def _calc1(self):
return 'b1'
def __calc2(self):
return 'b2'
a = A()
print a.result1(),a.result2()
b = B()
print b.result1(),b.result2()
ここでは、派生クラスB
が両方_calc1
をオーバーライドしているようです__calc2
が__calc2
、その名前はすでにクラス名でマングルされているため、オーバーライドされていないため、出力は
a1 a2
b1 a2
それ以外の
a1 a2
b1 b2
ただし、最終的には任意の規則を選択して文書化します。上記の場合でも、基本クラスがプライベートをオーバーライドできないわけではありません。ここに方法があります:)
class B(A):
def _calc1(self):
return 'b1'
def _A__calc2(self):
return 'b2'