簡體   English   中英

python中的實例

[英]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 ,則必須使用selfmytime ,並使用實例名稱而不是類名稱進行訪問。

該值永不更改的原因是,它是一個類變量,表示在定義和評估該類時,而不是在創建實例然后設置該值時。

如果要更改值,請在初始化程序中進行設置

首先將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”聲明實例變量。

  • self =實例作為類方法中的第一個參數
  • init = python中定義類的默認構造函數方法

希望會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM