我创建了下面的例子就明白了在蟒蛇的情况下,
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对应的副本?
让我们来看看这些行:
class test:
mytime = time.time();
这里设置类成员值 ,则执行类定义时,其一次计算,所以time.time()
包含模块时计算一次class test
被加载。
所述的每个实例class test
将收到预先计算的值,并且必须覆盖该值(例如,在__init__方法),通过访问它self
(其是存储参考实例的特殊参数),从而设置实例成员值 。
的mytime = time.time()
被定义的类时,执行(当解释器运行的类定义码,这将只运行一次,因此所有实例将得到相同的mytime
。
如果你想不同的mytime
在不同的情况下,你必须使用self
的一个,并用实例名称而不是类名来访问它。
究其原因值不会改变,因为它是在类的定义和评估,但不是当实例由然后该值设置类变量的含义。
如果你想要的值修改,使其设置的初始化器内
该数值指明MyTime变量被首先作为一个类变量,而不是一个实例变量创建。
Python的首先尝试在一个实例中查找姓名,如果没有找到它,它就会查找的类名称。 您可以通过查看对象的查询任何对象(包括)类的命名空间__dict__
,这是一个包含实例变量的字典。
只要你设置test1.mytime = 12
,你在创建该对象的新名称__dict__
,它从此阴影具有相同名称的类变量。
让我们取消注释“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”变量是像静态类成员。 和测试的所有实例()类(即:TEST1和TEST2)将共享类属性的相同的值。
print test1.newtime
o/p: 1347883063.421356
print test2.newtime
o/p: 1347883068.7103591
而,实例变量的值。 将类的每个实例不同。
因此,要想让每个实例不同的时序。 你需要在“ 初始化 ”方法使用“自我”来声明实例变量。
- 自我=实例作为类方法中的第一参数
- 在python INIT =默认的构造方法,用于定义类
希望,这将有助于。