在python实例(Instances in python)

2019-07-31 15:44发布

我创建了下面的例子就明白了在蟒蛇的情况下,

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对应的副本?

Answer 1:

让我们来看看这些行:

class test:
   mytime = time.time();   

这里设置类成员值 ,则执行类定义时,其一次计算,所以time.time()包含模块时计算一次class test被加载。

所述的每个实例class test将收到预先计算的值,并且必须覆盖该值(例如,在__init__方法),通过访问它self (其是存储参考实例的特殊参数),从而设置实例成员值



Answer 2:

mytime = time.time()被定义的类时,执行(当解释器运行的类定义码,这将只运行一次,因此所有实例将得到相同的mytime

如果你想不同的mytime在不同的情况下,你必须使用self的一个,并用实例名称而不是类名来访问它。



Answer 3:

究其原因值不会改变,因为它是在类的定义和评估,但不是当实例由然后该值设置类变量的含义。

如果你想要的值修改,使其设置的初始化器内



Answer 4:

该数值指明MyTime变量被首先作为一个类变量,而不是一个实例变量创建。

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

只要你设置test1.mytime = 12 ,你在创建该对象的名称__dict__ ,它从此阴影具有相同名称的类变量。



Answer 5:

让我们取消注释“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 =默认的构造方法,用于定义类

希望,这将有助于。



文章来源: Instances in python
标签: python class