2015-07-09 58 views
0

我試圖瞭解什麼時候你想要一個類的實例,以及這兩個代碼之間有什麼區別:你什麼時候使用實例? Python 3

A類需要一段時間,然後將它分配給新變量,然後返回該新變量。 C類需要一段時間,但也會創建一個函數D(使用self)的實例,然後返回self.seconds。

class C: 
    def D(self, time): 
     self.seconds = time 
     return self.seconds 

seconds = C().D(int) 

他們最終返回相同的數值。我很難理解這兩段代碼是如何不同的。在某些情況下比其他人更優秀嗎?

謝謝!

編輯:添加到這兩個函數的調用。

+0

第一,「第二」不綁定到類或instace。 –

+0

這是一個常見問題,我喜歡這篇文章的答案:http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner。 – jonnybazookatone

+0

你是怎麼調用這些方法的? –

回答

0

也許下面的(非常簡化的)例子有助於看到它可以是非常有用的一個類的實例:

class A: 
    minutes = 2 
    def time(seconds): 
     return 60*A.minutes + seconds 

class B: 
    minutes = 2 
    def time(self, seconds): 
     return 60*self.minutes + seconds 

print("Class:") 
print(A.time(30)) 
a1 = A 
a2 = A 
a1.minutes = 3 
a2.minutes = 4 
print(a1.time(30)) # 60*4 + 30 
print(a2.time(30)) # 60*4 + 30 
print("Instance:") 
print(B().time(30)) 
b1 = B() 
b2 = B() 
b1.minutes = 3 
b2.minutes = 4 
print(b1.time(30)) # 60*3 + 30 
print(b2.time(30)) # 60*4 + 30 

這導致:

Class: 
150 
270 
270 
Instance: 
150 
210 
270 
0

在覈心,你所要求的是理解靜態方法和普通方法之間的區別,以及OOP的優點。

可以在不實例化類的情況下調用靜態方法,例如在第一個示例中。這使您可以將單個標題(類)下的相關功能分組,但從技術上講它不是OOP。

但是,由於沒有實例,因此靜態方法沒有要處理的實例數據。

類實例允許您跟蹤對象特定的數據,並在您的方法中對其執行操作。

例如:

import time 

class Stopwatch: 
    def __init__(self, name, start): 
     self.name = name 
     self.time = start 
     self.active = False 
    def start(self): 
     self.active = True 
    def stop(self): 
     self.active = False 
    def reset(self, time): 
     self.time = time 
    def isComplete(self): 
     return (self.time == 0) 
    def tick(self): 
     if self.active: 
      self.time -= 1 
      print(self.name+": ",self.time) 
      if self.time == 0: 
       print("Timer of " + self.name + " has reached zero!") 
       self.stop() 

watchA = Stopwatch("A", 10) 
watchB = Stopwatch("B", 5) 

watchA.start() 
watchB.start() 

while (not watchA.isComplete()) or (not watchB.isComplete()): 
    time.sleep(1) 
    watchA.tick() 
    watchB.tick() 

運行此輸出:

A: 9 
B: 4 
A: 8 
B: 3 
A: 7 
B: 2 
A: 6 
B: 1 
A: 5 
B: 0 
Timer of B has reached zero! 
A: 4 
A: 3 
A: 2 
A: 1 
A: 0 
Timer of A has reached zero! 

通知如何每個表的時間是單獨,儘管使用相同的代碼跟蹤。這不可能使用靜態方法,因爲數據不是附加到,而是附加到Instanced對象本身。

相關問題