2016-11-21 11 views
-2

スーパークラスのメソッドからサブクラスのコンストラクタで設定された自己変数にアクセスしたいとします。Python:上書きされないスーパークラスのメソッドでサブクラスから変数にアクセス

class A(object): 
    def __init__(self): 
     self.a = "I'm the class A." 

    def getA(self): 
     return self.a 

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     self.a = "I'm the class B." 

x = B() 
print(x.getA()) 

結果は常に「A」です。サブクラスのコンストラクタでスーパー変数を上書きできないのはなぜですか?私はPythonで継承するのは初めてです。私はJavaの場合と同じように動作します。

編集:ありがとう、あなたのコメントのために。あなたが当然のことながら、これは実際に動作します。これは私がやろうとしていたことを実証するための短いスケッチでした。元のコードはもっと複雑で、私はいくつかの自己を欠いていました。まだ少し混乱しています。Javaで必要ないので、毎回自分で書く必要があります。

+1

'getA'に渡された' self'が欠けていること以外は、あなたのコードは期待通りに動作すると思います。(これは "私はクラスBです")。 – mgilson

+0

上記のとおり、投稿したコードは機能しません。それは 'def getA(self):'でなければなりません。それを修正してサンプルを実行してください。 「私はクラスBです。」と印刷します。私達はあなたがあまりにもできるように、テストにコピー/ペーストします! – tdelaney

答えて

1

「私はクラスBです」という出力が正しく表示されません。サブクラス内の変数を上書きすることができます。

さらに、def getA()def getA(self)である必要があります。

superの場合はそのまま使用できますが、Python 3.xの場合はsuper().__init__()の方が簡単です。同様に、3.xの上に新しいスタイルクラス(Pythonバージョンに依存)がある場合は、objectが不要です。

+0

あなたの 'super'コメントは、_if_OPがpython3.xで動作している引数を残すことができるようにするべきです。この質問は片方向にタグ付けされているわけではないので、OPがpython2.7を使用していないことを私は確信できません:-) – mgilson

+0

公正なポイントが編集されました。 – Pythonista

関連する問題