で静的クラス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つしかないので、実際には静的ではありません)。
誰でもこの動作を説明できますか?
乾杯。
そして、どのようにその身体を変更するには
はそれだけで静的VARを持つクラスはA.を通じてaccesedすることができ、ありますクラス内のstaticvarまたはself.staticvar?インスタンス(var)を解決できないため、print(self.staticvar)を使用しているときにエラーを発生させるべきではありませんか? – Notbad
クラスインスタンスの名前解決はインスタンス上で開始されますが、クラス自体に戻ります。たとえば、クラスのメソッドはインスタンスではなくクラスに定義されますが、インスタンスで呼び出すことができます。たとえば 'a = A()'を指定すると、 'a.setStaticVar(5)'は 'A.setStaticVar(a、5)'に解決され、実際にはその2行目を書くことができます。同じ。同様に、 'staticvar'は' A'に存在し、 'a'でアクセスすることができ、同じ名前の' a'のプロパティーを定義することで陰になることができます。 – scnerd
一般的に、Pythonのような動的型言語では(私はJSや同様の言語でも同じことが成り立つと信じています)、純粋に名前の値とバックアップのツリーのマッピングという意味で "クラス"と "インスタンス"名前がどんな特定の時点でも解決されなければ、あなたは行くことができます。オブジェクト、型、モジュール、そしてローカルコンテキスト(クロージャ)さえも、お互いにネストできる単なる辞書です。さまざまなレベルで辞書を修正するためにゲームをプレイすることはできますが、そのような言語では「静的」な変数はあまりありません。 – scnerd