2012-09-30 151 views
3

我試過下面的例子,需要一些澄清..在這兩種情況下,我能夠訪問測試函數中的類變量和實例。類變量vs實例變量--Python

因此,假設我必須定義一個需要在所有函數中使用的文字,這將是更好的方法來定義..本身變量或類變量?

code.py

class testclass: 
    classvar = 'its classvariable LITERAL' 
    def __init__(self,x,y): 
     self.z = x 
     self.classvar = 'its initvariable LITERAL' 

     self.test() 

    def test(self): 
     print('class var',testclass.classvar) 
     print('instance var',self.classvar) 

if __name__ == '__main__': 
    x = testclass(2,3) 

回答

3

對於所有實例使用的「常量」,類變量都非常好(這是所有方法在技術上的原因)。你可以使用模塊全局變量,但是使用類變量可以更清楚地與類相關聯。

實際上也經常使用類變量,但通常情況下最好遠離它們,因爲您遠離程序的不同部分通過更改全局變量進行通信的原因。

實例變量適用於實際上是實例的一部分的數據。它們對於每個特定實例可能不同,並且它們經常在單個特定實例的生命週期中改變。對於數據來說,最好使用實例變量作爲實例的一部分,即使在您的程序中,您碰巧只有一個實例,或者您有幾個實例始終具有相同的值。

3

,如果你希望它的所有實例之間共享你應該把它定義爲一個類屬性。如果您需要爲每個實例分別設置一個實例變量(例如,如果不同實例的變量值可能不同),則應將其定義爲實例變量。

3

這是很好的做法是隻使用類的屬性,如果他們要保持固定,以及關於它們的一個偉大的事情是,他們可以一個實例的外部訪問:

class MyClass(): 
    var1 = 1 
    def __init__(self): 
     self.var2 = 2 

MyClass.var1 # 1 (you can reference var1 without instantiating) 
MyClass.var2 # AttributeError: class MyClass has no attribute 'var2' 

如果MyClass.var定義,它應該在MyClass的每個實例中都是相同的,否則會得到以下被認爲令人困惑的行爲。

a = MyClass() 
b = MyClass() 

a.var1, a.var2 # (1,2) 
a.var1, a.var2 = (3,4) # you can change these variables 
a.var1, a.var2 # (3,4) 
b.var1, b.var2 # (1,2) # but they don't change in b 
MyClass.var1 # 1   nor in MyClass 
+0

B獲得了自己的「實例」之類的變量? –

+0

@ Reb.Cabin不,他們是全球性的。 –

+0

'a.var1'與'b.var1'不同,但是,正如你的例子所示,我認爲'b.var1'和'MyClass.var1'是一樣的(至少我的實驗與這個想法是一致的) 。所以,以某種方式將'3'分配給'a.var1'使得實例'a'成爲特定的東西。你會好好解釋一下嗎? –

6

我知道這是一個古老的..但我發現這在由Guido van Rossum的1999年(http://legacy.python.org/doc/essays/ppt/acm-ws/sld001.htm)製作的老介紹,我想這說明了精美的話題:

實例變量規則

關於使用通過實例(self.x),搜索順序:

  • (1)的實例,(2)類,(3)基類
  • 這也適用於方法查找

在通過實例分配新建分配FY(self.x = ...):

  • 總是讓變量
  • 類變量 「默認」 爲實例的實例變量

但......!

  • 可變類變量:一個副本所有
  • 可變實例變量共享:每個實例自己的