1

Pythonのインスタンスを理解するために、次の例を作成しました

import time;
class test:
    mytime = time.time();   
    def __init__(self):
        #self.mytime = time.time();
        time.sleep(1);
        pass


from test import test

test1 = test()
test2 = test()

print test1.mytime
print test2.mytime

test1.mytime = 12

print test1.mytime
print test2.mytime

この場合、出力 ID は次のとおりです。

1347876794.72
1347876794.72
12
1347876794.72

test2.mytime は test1.mytime よりも 1 秒大きいと予想しました。各インスタンスで mytime に関するコピーを作成しないのはなぜですか?

4

5 に答える 5

8

これらの行を見てみましょう:

class test:
   mytime = time.time();   

ここでは、クラス定義の実行時に一度計算されるクラス メンバの値time.time()を設定します。つまり、含まれるモジュールclass testのロード時に一度計算されます。

のすべてのインスタンスはclass test事前に計算された値を受け取り、その値を (たとえば __init__ メソッドで) オーバーライドし、self(インスタンスへの参照を格納する特別な引数) を介してアクセスし、インスタンス メンバー valueを設定する必要があります。

于 2012-09-17T10:22:35.713 に答える
3

これmytime = time.time()は、クラスが定義されたときに実行されます (インタープリターがクラス定義コードを実行するとき、これは 1 回だけ実行されるため、すべてのインスタンスが同じmytime.

mytime異なるインスタンスで異なるものが必要な場合は、selfのものを使用し、クラス名ではなくインスタンス名でアクセスする必要があります。

于 2012-09-17T10:23:29.083 に答える
1

mytime 変数は、最初にインスタンス変数ではなくクラス変数として作成されます。

Python は最初にインスタンスの名前を見つけようとし、見つからない場合はクラスの名前を検索します。__dict__インスタンス変数を含むディクショナリであるオブジェクトの を調べることで、任意のオブジェクト (含む) クラスの名前空間を照会できます。

を設定するとすぐに、そのオブジェクトのに新しいtest1.mytime = 12名前が作成され、それ以降、同じ名前のクラス変数がシャドウされます。__dict__

于 2012-09-17T10:29:28.153 に答える
1

値が変更されない理由は、クラスが定義および評価されるときを意味するクラス変数であるためですが、インスタンスが作成されてから値が設定されるときではありません。

値を変更したい場合は、イニシャライザ内に設定してください

于 2012-09-17T10:23:36.413 に答える
1

コードから「self.mytime = time.time()」行のコメントを外しましょう。

class test:
    mytime = time.time();   
    def __init__(self):
        self.newtime = time.time();
        time.sleep(1);
        #pass - no use of pass here


test1 = test()
test2 = test()

print test1.mytime
o/p: 1347883057.638443
print test2.mytime
o/p: 1347883057.638443

この場合、「mytime」変数は静的クラス メンバーのようなものです。また、test() クラスのすべてのインスタンス (つまり、test1 と test2) は、クラス属性の同じ値を共有します。

print test1.newtime
o/p: 1347883063.421356

print test2.newtime
o/p: 1347883068.7103591

一方、インスタンス変数の値。クラスのインスタンスごとに異なります。

したがって、インスタンスごとに異なるタイミングを取得します。「 init」メソッドで「self」を使用してインスタンス変数を宣言する必要があります。

  • self = クラス メソッドの最初のパラメータとしてのインスタンス
  • init = 定義されたクラスの Python のデフォルト コンストラクタ メソッド

うまくいけば、それは役に立ちます。

于 2012-09-17T12:19:31.867 に答える