2012-08-31 63 views
1

我正在寫大量的代碼,並且我沒有足夠的經驗介紹在python類和函數中使用變量的最佳方式,所以我想我會問對於一些意見。下面是我怎麼能做到這一點python - 在類和函數中使用變量的最佳實踐

class MyClass(): 
    vara = 'Class Variable A' 

    def __init__(self): 
     self.varb = 'Class instantiation Variable B' 

    def a(self): 
     varc = 2 
     vard = 3 

     print 'def a function variables unchanged', varc, vard 

     MyClass.vara = 'Class Variable A now changed by def a' 

    def b(self): 
     print self.varb 
     self.varb = 'Class instantiation Variable B now changed by def b' 
     print self.varb 

if __name__ == "__main__": 
    print MyClass.vara 

    a = MyClass() 
    a.a() 
    a.b() 

    print MyClass.vara 

    a.a() 

這給出了這樣的結果

Class Variable A 
def a function variables unchanged 2 3 
Class instantiation Variable B 
Class instantiation Variable B now changed by def b 
Class Variable A now changed by def a 
def a function variables unchanged 2 3 

我的Django應用程序是使用一類具有大約25功能的示例。它是一個測試應用程序,每個函數代表一個API調用。每個API調用都會根據結果給出幾個變量,並且我需要由函數設置的這些變量供其他函數使用 - 換句話說,我需要通過其他函數調用這些局部函數變量。我想知道做到這一點的最佳方式。

在上面的例子中,我可以使用類中的函數設置類變量vara,通過這樣做MyClass.vara = 'something'或者我可以設置實例化構造函數__init__中的變量。然後我可以使用任何函數調用這些變量。

有什麼更好的方法,還是有更好的方法來做到這一點?

回答

4

不知道我是否完全明白你的要求,但如果我理解正確,答案是它取決於你想要做什麼。如果您希望爲整個班級存儲一次,則應該在班級上設置該屬性(如vara中所示)。如果您需要每個實例的單獨屬性,則應該在__init__(如在您的varb中)中將其設置爲實例。

如果您將可變對象(如列表)作爲屬性的值,則區別將變得更清晰。請看下圖:

>>> class Foo(object): 
...  classVar = [] 
...  def __init__(self): 
...   self.instVar = [] 
>>> f = Foo() 
>>> g = Foo() 
>>> f.classVar 
[] 
>>> f.instVar 
[] 
>>> g.classVar 
[] 
>>> g.instVar 
[] 
>>> f.instVar.append(1) 
>>> f.instVar 
[1] 
>>> g.instVar 
[] 
>>> f.classVar.append(1) 
>>> f.classVar 
[1] 
>>> g.classVar 
[1] 

請注意,在最後一位,變異f.classVar也影響g.classVar。由於這是一個類屬性,因此它將在該類的所有實例中共享。實例屬性(instVar)對於每個實例都是獨立的。

+0

好的..我想我會幫你。所以我可以使用一個對象創建很多實例。無論對象是否改變類變量,object.class變量都是相同的,但類的即時變量將獨立於每個對象? – Oli