シンプルアンダースコアは、変数の発信者/ユーザーを落胆するだけの慣例である:あなたの例では(おそらくインスタンス変数ではなく、クラス変数を定義したいことを除いて)
に動作します変数のプライベートを作るためにあなたが持っていますダブルアンダースコアを使用する:
class A_parent:
__myVar=0
class B_child(A_parent):
__myVar=__myVar+1 # __myVar or A and B are different: error because right term is not defined yet.
あなたは「保護された種類」の変数について話しています。そのような場合は、単純なアンダースコアを使用することをお勧めします。
はるかに便利なインスタンス変数の例、:
class A_parent:
def __init__(self):
self._myVar=0
class B_child(A_parent):
def __init__(self):
# call parent constructor else _myVar isn't defined
A_parent.__init__(self)
# syntax using super
# super(B_child, self).__init__()
self._myVar+=1 # Okay
あなたが本当にプライベート親属性にアクセスする場合は、あなたがこれを行うことができます:
class A_parent:
def __init__(self):
self.__myVar=12
class B_child(A_parent):
def __init__(self):
# call parent constructor
A_parent.__init__(self)
print(self._A_parent__myVar) # will print 12 when class is instantiated
をもちろんそれはill-です助言された。母クラスをリファクタリングできない場合にのみ使用してください。私はそれをする必要はなかった。あなたはその場でメンバーを定義するC++やJavaでは、コンストラクタを呼び出していないが、まだ親を定義します。あなたは、親のコンストラクタへの呼び出しを省略した場合、self._A_parent__myVar
は (Pythonは動的言語で定義されないことを
注意メンバー変数、ただしここではありません)
ダブルアンダースコアの場合 - アクセス方法は? – user6750923
この行は 'A_parent .__ init __(self)'とは何ですか?それは親のコンストラクタを呼び出していますか?それは義務ですか?しかし、親クラスを子クラス 'class B_child(A_parent):'に渡すと、要件を満たしませんか? – user6750923
お勧めです!またはあなたはLiskov principeを破り、あなたのケースでは変数が定義されていません。 –