通常、単一のアンダースコアを使用します。 _myvar
(C++のように)派生クラスで使用され、二重アンダースコアを使用するメソッド/属性の保護。 __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
は、その名前がすでにクラス名を持つマングルされているので、出力は
a1 a2
b1 a2
代わりの
であるため、上書きされていない
_calc1
と
__calc2
が、
__calc2
の両方をオーバーライドしているようです
a1 a2
b1 b2
最終的にはいかなる慣習も選択して文書化しますトンベースクラスがプライベートオーバーライドすることはできません、ここでの方法です:)すべての
class B(A):
def _calc1(self):
return 'b1'
def _A__calc2(self):
return 'b2'
慣習は、私が知る限り、クラスのドキュメントストリングに文書化することです。それ以外の特別な規約はないと思います。 –