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