2016-08-29 5 views
0

python3でプライベート変数にアクセスするのは混乱します。間違った方法で新しい変数にアクセスすると、新しい変数が作成されるためです。プライベート変数_data(単一のアンダースコア、右?)をクラス内に作成し、子クラスでアクセスしたいと思います。python3でプライベート変数と保護された変数と関数を定義してアクセスする方法は?

class A_parent: 
     _myVar=0 


class B_child: 
     _myVar=_myVar+1 #Right or wrong? 

python3private, protected modifierの規則は何ですか?

答えて

0

シンプルアンダースコアは、変数の発信者/ユーザーを落胆するだけの慣例である:あなたの例では(おそらくインスタンス変数ではなく、クラス変数を定義したいことを除いて)

に動作します変数のプライベートを作るためにあなたが持っていますダブルアンダースコアを使用する:

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は動的言語で定義されないことを

注意メンバー変数、ただしここではありません)

+0

ダブルアンダースコアの場合 - アクセス方法は? – user6750923

+0

この行は 'A_parent .__ init __(self)'とは何ですか?それは親のコンストラクタを呼び出していますか?それは義務ですか?しかし、親クラスを子クラス 'class B_child(A_parent):'に渡すと、要件を満たしませんか? – user6750923

+0

お勧めです!またはあなたはLiskov principeを破り、あなたのケースでは変数が定義されていません。 –

関連する問題