2017-10-18 15 views
0

で静的クラスVARSについて混乱少しのコード例:はここでのpython

class A: 
    staticvar=3; 

    def foo2(self): 
     print("------ Foo2") 
     print("static: "+str(A.staticvar)); 
     print("instance: "+ str(self.staticvar)); 

class B(A): 

    def setStaticVar(self, num): 
     B.staticvar=num; 


a=A(); 
b=B(); 

a.staticvar=7; 
a.foo2(); 

b.setStaticVar(100); 

a.foo2(); 

b.foo2(); 

でどのような結果:

------ 
static: 3 
instance: 7 -->correct. Instance var modified 
------ 
static: 3 
instance: 7 --> Not correct. Why static var is not 100 
------ 
static: 3 
instance: 100 --> Correct, but this value should be shared between A and B 

なぜこの出来事はありますか?静的変数をAとBの間で共有すべきではないか?なぜそれがbからbで修正されるのか?

この例から、各クラスには独自の静的なvarがあります(静的なvarが1つしかなく、クラスごとに1つしかないので、実際には静的ではありません)。

誰でもこの動作を説明できますか?

乾杯。

答えて

0

私があなたに迷惑をかけているのは、名前解決の問題です。 B.staticvarを取得すると、インタープリタはそれを見つけられず、そのスーパークラスに戻って名前解決を試みます。 Aに移動すると、インタープリタはstaticvarを見つけてその値を返します。

あなたはB.staticvarに値を設定すると、しかし、あなたはstaticvar呼ば新しいプロパティがBに追加されたあなたの「インスタンス」の場合、ほとんど同じ動作を取得。ここで、B(またはそのインスタンス)のプロパティ名を解決しようとすると、Aに落ちることなくこの新しい値が使用されます。 Pythonでは、クラスを継承することはプロパティの共有に関することではなく、子クラスで定義されていないときに名前を解決する代替クラスを設定することです(なぜ、明示的にメソッドをオーバーライドする必要がないのですか?親機能を実行させたい場合はの中でsuper(A).method_nameに電話することを忘れないでください)。どちらか、あなたが求めている動作を取得AsetStaticVarを定義、および/またはA.staticvar=num

+0

そして、どのようにその身体を変更するには

はそれだけで静的VARを持つクラスはA.を通じてaccesedすることができ、ありますクラス内のstaticvarまたはself.staticvar?インスタンス(var)を解決できないため、print(self.staticvar)を使用しているときにエラーを発生させるべきではありませんか? – Notbad

+1

クラスインスタンスの名前解決はインスタンス上で開始されますが、クラス自体に戻ります。たとえば、クラスのメソッドはインスタンスではなくクラスに定義されますが、インスタンスで呼び出すことができます。たとえば 'a = A()'を指定すると、 'a.setStaticVar(5)'は 'A.setStaticVar(a、5)'に解決され、実際にはその2行目を書くことができます。同じ。同様に、 'staticvar'は' A'に存在し、 'a'でアクセスすることができ、同じ名前の' a'のプロパティーを定義することで陰になることができます。 – scnerd

+1

一般的に、Pythonのような動的型言語では(私はJSや同様の言語でも同じことが成り立つと信じています)、純粋に名前の値とバックアップのツリーのマッピングという意味で "クラス"と "インスタンス"名前がどんな特定の時点でも解決されなければ、あなたは行くことができます。オブジェクト、型、モジュール、そしてローカルコンテキスト(クロージャ)さえも、お互いにネストできる単なる辞書です。さまざまなレベルで辞書を修正するためにゲームをプレイすることはできますが、そのような言語では「静的」な変数はあまりありません。 – scnerd