2012-06-25 27 views
1

我懷疑類方法對某些變量集的操作與相應的非類函數的操作不同。這是一個例子。假設我們有一組變量:A,B,C,並且我們希望根據一些算法隨時間對它們進行修改。有2種可能的實現方式:與非類函數不同的python類方法

1)類:

class variables: 
     def __init__(self): 
      self.A = 0.0 
      self.B = 0.0 
      self.C = 0.0 
     def changeA(self): 
      self.A = some function of A, B and C   
     def changeB(self): 
      self.B = some function of A, B and C 
     def changeC(self): 
      self.C = some function of A, B and C 

並調用很多次:

ob = variables() 
    i = 0 
    while i<N: 
     ob.changeA() 
     ob.changeB() 
     ob.changeC() 
     i = i + 1 

2)無類

A, B, C = 0.0, 0.0, 0.0 
    def changeA(A,B,C): 
     A = some function of A, B and C (same as in class method) 
     return A 
    def changeB(A,B,C): 
     B = some function of A, B and C (same as in class method) 
     return B 
    def changeC(A,B,C): 
     C = some function of A, B and C (same as in class method) 
     return C 

並調用很多次:

​​3210

在我看來,2種方法的結果必須相同。唯一的區別是變量A,B和C已知的名稱空間(對象本地或全局函數實現 - 但在這兩種情況下,方法都可以訪問所需的變量)。但是,兩種方法的結果似乎有所不同。所以我的問題是在類方法實現/理解中缺少什麼?

具體而言,實施方法changeA的例子:

作爲一個類的方法:

(... inside the class) 
    def changeA(self): 
     self.A = self.A + 2.0*self.B - 3.0*self.C*(self.B-self.A) 

作爲一個功能:

def changeA(A,B,C): 
     A = A + 2.0*B - 3.0*C*(B-A) 
     return A 
+2

你有沒有想過用'self.'在課堂上每次使用A,B和C的前綴?否則,您將訪問全局名稱而不是本地名稱。 –

+0

是什麼讓你覺得這些行爲有所不同?你能發佈一些顯示差異的特定(工作)代碼嗎? – lvc

+1

在這兩個示例中,您都沒有定義類變量。在例子(1)中,你有一個具有三個實例屬性(變量)的實例。 – msw

回答

0

我想說的是,在第一種情況,每當創建新的variables實例時,A,BC的值被重置,這不是第在第二種方法中,他們似乎是全球性的。根據您使用這些實例的方式,結果可能會受到影響。

編輯:後OP在評論的問題,在這裏是如何定義的類變量:

>>> class Variables: 
    A = 0.0 
    B = 0.0 
    C = 0.0 

    def changeA(self): 
      Variables.A = Variables.A + Variables.B * Variables.C 


>>> v = Variables() 
>>> v.changeA() 
>>> v.A 
0.0 
>>> Variables.A 
0.0 
>>> 

正如你所看到的,沒有必要了,不能再定義一個__init__方法。您可以通過instance.Aclass.A訪問這些變量。

+0

如何使類變量A,B和C與類(如在C++中)一樣全局?我的目標是修改一些全局變量,而不必在每次迭代時重置它們。這在函數實現中似乎很簡單,但我如何在類實現中做到這一點? – user938720