2017-10-26 9 views
1

私はインスタンス変数を設定しようとしていたクラスBとCによって継承されたベースクラスAを持っています。このような変数は、以下のように基本クラスAのメソッドによって使用されます。Pythonのベースクラスにインスタンス変数を追加する

class A(object): 
    def foo(self): 
     print(self.value) 

class B(A): 
    value = "B" 

class C(A): 
    value = "C" 

>>> b = B() 
'B' 
>>> c = C() 
'C' 

私は機能fooのみ限り、私はAのインスタンスからまっすぐfooを起動していないようで結構です実行中に評価されます理解しています。 しかし、value = "B"value = "C"がどのようになってself.value = "B"self.value = "C"になることがわかりません。

申し訳ありませんが、これは素朴な質問です。私は今かなり長い間、Pythonとは遠く離れていて、まったく同じようなものは見ていませんでした。私はPythonバージョン2.7.12を使用しています。

+2

これらはインスタンス変数ではなく、インスタンスからアクセスされるクラスレベルの変数です。 –

+0

@ juanpa.arrivillagaしかし、このアクセスは 'self.value'の代わりに' value'を通して起こるべきではありませんか? 'self.value'はなぜ機能するのですか? – Rubens

+1

いいえ、 'value'はどのスコープでも定義されていません。それは 'NameError'を発生させます。 'MyClass.value'や' my_instance.value'を使うことができますが、 'value'だけでローカル変数やグローバル変数を見つけようとします。インスタンスの属性にアクセスするときは、まずインスタンスの名前空間を調べ、見つからなければクラスの名前空間をチェックし、次にMRO内のすべてのクラスを名前が解決されるまでチェックするか、またはAttributeError 'が生まれる。それは簡単に継承です。 [この質問](https://stackoverflow.com/questions/10313471/python-access-class-variables-via-instance)を参照してください –

答えて

1

インスタンス変数はクラスではなくインスタンスにのみ追加できるため、インスタンス変数をPythonのベースクラスに追加することはできません。

例では、「値」はクラス変数です。 Pythonでは、与えられた名前を持つインスタンス変数がない場合、その名前を持つクラス変数に戻ります。ただし、b.valueに新しい値を代入すると、bにインスタンス変数が作成されます。 B.valueは影響を受けず、Bの新しいインスタンスも同様です。

私はこの動作に関する信頼できる参照は見つかりませんでしたが、ここではその記事を紹介します。 https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

+0

ああ、私は実際にその名前を持つインスタンス変数がないことを知りませんでしたその名前のクラス変数*に戻ります。あなたはいくつかの参考資料を提案しますので、私はこのデフォルトの動作定義をよりよく理解できますか?前もって感謝します。 – Rubens

+1

元の投稿の前に正式な参照が見つかりませんでしたので、私はそれを含めませんでした。私は記事を含めるために私の答えを更新しました。 –

+1

@Rubensすべての詳細は[データモデル](https://docs.python.org/3/reference/datamodel.html#)にあります。たとえば、このスニペットは次のとおりです。「カスタムクラスの種類は、通常、クラス定義によって作成されますクラス属性の参照は、この辞書のルックアップに変換されます。たとえば、 'Cx'は' C___ dict__ ["x"] 'に変換されます(ただし、属性を見つけるための他の手段を可能にするフックの数です。**属性名がそこに見つからない場合、属性検索は基本クラスで継続されます。** " –

関連する問題