5

異なるシナリオで2つのクラスがあるとしましょう。

シナリオ1

class MyClass():
    temp = 5

シナリオ2

class MyClass():
    temp = 5

    def myfunc(self):
          print self.temp

これで、いつ変数tempがクラス変数およびインスタンス変数として扱われるようになります。どちらのシナリオでも、両方を使用して変数の値にアクセスできるため、混乱していますtemp

  1. Object.Temp(インスタンス変数として動作)

  2. ClassName.Temp(クラス変数として動作)

以前にも同様の質問があったと思いますが、誰かが私の質問の文脈でこれを説明できれば、とても助かります。

4

3 に答える 3

6

クラス変数は、クラスのすべてのインスタンス間で共有されます。不変の型(int、str、...など)を使用すると、大きな違いに気付くことはありません。しかし、これを考慮してください:

class MyClass():
    temp = []  
    def myfunc(self, val):
          self.temp.append(val)
          print self.temp

instance1 = MyClass()
instance1.myfunc(1)    # [1]
instance2 = MyClass()
instance2.myfunc(2)    # [1, 2]

この場合、両方のインスタンスが同じリストを共有します。つまり、インスタンス自体にメンバーがない場合はtemp、クラスのメンバーが使用されます。

したがって、さらに行う場合:

MyClass.temp.append(3)
print instance1.temp   # [1, 2, 3]
instance1.temp = []
print instance1.temp   # []         uses the instances temp
print instance2.temp   # [1, 2, 3]
del instance1.temp
print instance1.temp   # [1, 2, 3]  uses the class' temp again
于 2012-06-02T12:22:26.193 に答える
5

基本的に、MyClass.tempは常にクラス変数です。obj.tempを設定しようとするまで、Gettingはクラス変数を返しますobj.temp。これにより、クラス変数をマスクするメンバー変数が作成されます。これがお役に立てば幸いです。

>>> class MyClass(object):
...     temp = 5
... 
>>> a = MyClass()
>>> b = MyClass()
>>> a.temp
5
>>> b.temp
5
>>> b.temp = 6
>>> a.temp
5
>>> MyClass.temp = 7
>>> a.temp
7
>>> b.temp
6
>>> a.__dict__
{}
>>> b.__dict__
{'temp': 6}
>>> MyClass.__dict__
{..., 'temp': 7}

編集:mataが言うように、onのメソッド(などappend())を呼び出すことは、obj.tempそれを「設定する」とは見なされません。

于 2012-06-02T12:21:52.570 に答える
2

tempクラス変数です。変数にアクセスすると、継承のレイヤーを介して検索されるため、インスタンス自体には見つからないため、クラス(次のレイヤー)をチェックしてそこで見つけます。

于 2012-06-02T12:25:15.607 に答える