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()定义类时执行(当解释器运行类定义代码时,它只会运行一次,所以所有实例都会得到相同的mytime

如果您想mytime在不同的实例中有所不同,则必须使用self's ,并使用实例名称而不是类名称来访问它。

于 2012-09-17T10:23:29.083 回答
1

值永远不会改变的原因是因为它是一个类变量,意味着在定义和评估类时而不是在创建实例时设置值。

如果您希望更改值,请将其设置在初始化程序中

于 2012-09-17T10:23:36.413 回答
1

mytime 变量首先创建为类变量,而不是实例变量。

Python首先尝试在实例上找到一个名称,如果没有找到,它将在类中查找该名称。您可以通过查看对象的__dict__(包含实例变量的字典)来查询任何对象(包括)类的名称空间。

设置后,您就在该对象的 中test1.mytime = 12创建了一个__dict__名称,从那时起,该名称就隐藏了具有相同名称的类变量。

于 2012-09-17T10:29:28.153 回答
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 = instance 作为类方法中的第一个参数
  • init = python 中定义类的默认构造方法

希望,它会有所帮助。

于 2012-09-17T12:19:31.867 回答