1

クラスの新しいインスタンスが作成された後も同じままであるのはなぜですか?

class Test(object):
    i = 0
    def add(self):
        Test.i += 1

このコードを実行する

t = Test()
print t.i
t.add()
t2 = Test()
print t2.i
print t.i

与える

0
1
1

tiとt2.iの両方が0に等しくなかったのはなぜですか?t2 = Test()行がiを0にリセットするので、それらは0に等しいべきではありませんか?

4

3 に答える 3

2

iインスタンス変数ではなく、クラス変数です。それはクラス自体にバインドされています (そのためTest.i、 のインスタンスがTest存在しなくても を記述できます)。

iインスタンス変数を作成する必要があります。

class Test(object):
    def __init__(self):
        self.i = 0

    def add(self):
        self.i += 1
于 2013-03-17T22:12:32.273 に答える
1

インスタンスのプロパティではなく、クラス全体のプロパティを変更しています。これを試して:

class Test(object):
    i = 0
    def add(self):
        self.i += 1

Python は、インスタンスを引数としてselfメソッドに自動的に渡します。したがって、メソッド内では、インスタンスのプロパティを として参照できますself.i

于 2013-03-17T22:12:39.853 に答える
0
class Test(object):
    i = 0
    def add(self):
        Test.i += 1

print "Test.i  == ",Test.i
print "'i' in dir(Test) == ",'i' in dir(Test)
print "'i' in Test.__dict__  == ",'i' in Test.__dict__

t1 = Test()
print '\n# t1 = Test() executed'
print "t1.i  == ",t1.i
print "'i' in dir(t1) == ",'i' in dir(t1)
print "'i' in t1.__dict__  == ",'i' in t1.__dict__

結果

Test.i  ==  0
'i' in dir(Test) ==  True
'i' in Test.__dict__  ==  True

# t1 = Test() executed
t1.i  ==  0
'i' in dir(t1) ==  True
'i' in t1.__dict__  ==  False

.

オブジェクトの名前の属性は__dict__、このオブジェクトの名前空間を表す辞書です。つまり、オブジェクトの属性が含まれています。

また、次のものがあります。

dir([オブジェクト])

オブジェクトに という名前のメソッドがある場合__dir__()、このメソッドが呼び出され、属性のリストを返す必要があります。

dir(t1)では、属性 i を含み、属性iを含まないということはどのように可能t1.__dict__でしょうか? 2 つすべてdir(Test)Test.__dict__属性iが含まれていますが、 ?

.

それはあなたの質問に答えるのと同じ理由です:

オブジェクトの属性を返す動作は厄介です。
そして`dir(object)、このぎこちなさを反映しています:

デフォルトの dir() メカニズムは、完全ではなく最も関連性の高い情報を生成しようとするため、オブジェクトの種類によって動作が異なります。

オブジェクトがモジュール オブジェクトの場合、リストにはモジュールの属性の名前が含まれます。
•オブジェクトが型またはクラスオブジェクトの場合、リストにはその属性の名前と、そのベースの属性が再帰的に含まれます。
•それ以外の場合、リストには、オブジェクトの属性の名前そのクラスの属性の名前、およびそのクラスの基本クラスの属性の再帰的な名前が含まれます。

.

それから、あなたの質問への答えは2つの部分に分かれています:

1)dir(t1)オブジェクトの属性と見なされるものを示しますが、オブジェクトの REAL NAMESPACE として公開され、属性it1.__dict__が含まれていません。これは、すでに回答されているように、実際にはクラスの属性です。

したがって、 2 つのインスタンスt1t2の疑似属性iは等しいように見えます。これは、式とが実際には として評価される ためです 。t1.it2.iTest.i
dir(t1)dir(t2)Test.i

2) 式が??t1.iとして評価される方法 そのため(これは私の回答の追加情報を構成します):Test.i

クラス インスタンスには、属性参照が検索される最初の場所であるディクショナリとして実装された名前空間があります。そこに属性が見つからず、インスタンスのクラスにその名前の属性がある場合、検索はクラス属性で続行されます。

http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy

これは、オブジェクトの名前空間で属性が見つからない場合、オブジェクトがインスタンスであるクラスの名前空間で検索されることを意味します。

于 2013-03-17T22:59:45.827 に答える