[英]Instances in python
我創建了以下示例以了解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
在這種情況下,輸出標識如下:
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
(這是存儲對實例的引用的特殊參數)對其進行訪問,從而設置實例成員value 。
mytime = time.time()
在定義類時執行(當解釋器運行類定義代碼時,它將僅運行一次,因此所有實例將獲得相同的mytime
。
如果要在不同的實例中使用不同的mytime
,則必須使用self
的mytime
,並使用實例名稱而不是類名稱進行訪問。
該值永不更改的原因是,它是一個類變量,表示在定義和評估該類時,而不是在創建實例然后設置該值時。
如果要更改值,請在初始化程序中進行設置
首先將mytime變量創建為類變量,而不是實例變量。
Python會嘗試首先在實例上找到名稱,如果找不到,它將在類上查找名稱。 您可以通過查看對象的__dict__
來查詢任何對象(包括類)的名稱空間,該對象是包含實例變量的字典。
一旦設置了test1.mytime = 12
,便在該對象的__dict__
創建了一個新名稱,此后此名稱就用相同的名稱test1.mytime = 12
了類變量。
讓我們從代碼中取消注釋“ 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”聲明實例變量。
希望會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.