2014-02-22 43 views
-2

我有一個愚蠢的問題。我想我不明白python中的變量範圍。訪問在類內部聲明的變量

我有以下代碼。

#!/bin/python 

class Test: 
    def Inc(self): 
     Count = Count + 1 
     print 'Count = ' + str(Count) 

class Test2: 
    def Dec(self): 
     Count = Count - 1 
     print 'Count = ' + str(Count) 


def main(): 
    t = Test() 
    t2 = Test2() 
    t.Inc() 
    t2.Dec() 

if __name__ =='__main__': 
    main() 

是否有聲明和使用計數我做的方式呢?

我做以上不工作的方式,我碰到下面的錯誤 -

UnboundLocalError: local variable 'Count' referenced before assignment 
+1

哪裏有你'初始化Count'? – thefourtheye

+0

我應該不?我應該在哪裏初始化它?在main()中?我想它的一個非常可怕的問題,人們downvoted它,雖然我懵了,甚至理解爲什麼:) – user220201

+0

@ user220201「我應該在哪裏初始化呢?」在類的'__init__'成員函數中。 – starrify

回答

-1
Count = 0 

class Test: 
    def Inc(self): 
     global Count 
     Count = Count + 1 

您必須聲明您正在使用全局版本。如果你想要一個實例變量做到這一點...

def Inc(self): 
    self.count = ... 
+0

直到現在我還不知道關鍵字global是否存在於python中。謝謝!我會更多地閱讀它。它似乎是我正在尋找的那個。我有可能不想使用它嗎? – user220201

+0

爲什麼你會使用一個類來簡單地增加一個全局變量? – dawg

+0

問題是關於在類中訪問該變量。我們不知道他是否真的在課堂上做更多,他只是沒有在這裏發佈。 – jeremyjjbrown

2

你,因爲你使用Count(式中Count + 1)有你的錯誤之前,你曾經說過什麼是伯爵。

你可能要像

class Test(object): 
    def __init__(self): 
     self.count = 0 

    def inc(self): 
     self.count = self.count + 1 # or self.count += 1 
     print 'Count = ' + str(self.count) 

def main(): 
    t = Test() 
    t.inc() 

if __name__ =='__main__': 
    main() 
+0

請參閱對問題的編輯。我有兩個我想要使用的課程來自 – user220201

0

Count是一個局部變量,創建的每個Inc被調用,並丟棄返回時間。你想要的是一個實例屬性。要使實例屬性,它需要被綁定到self,像這樣:

def Inc(self): 
    self.Count = self.Count + 1 
    print 'Count = ' + str(Count) 

別急!self.Count + 1無法評估,因爲self.Count尚不存在!因此,在您__init__(你即將定義),將其設置爲0

class Test: 
    def __init__(self): 
     self.Count = 0 

    def Inc(self): 
     self.Count = self.Count + 1 
     print 'Count = ' + str(Count) 

最後,這是習慣性地啓動功能和小寫的變量名,留下大寫的類名。所以一切都更改爲以下:

class Test: 
    def __init__(self): 
     self.count = 0 

    def inc(self): 
     self.count = self.count + 1 
     print 'count = ' + str(count) 

def main(): 
    t = Test() 
    t.inc() 

要訪問它的類外,使用此:

>>> t = Test() 
>>> t.inc() 
>>> print t.count 
1 
+0

請參閱編輯問題。 – user220201

+0

@ user220201,你在這裏移動目標崗位...但被說是你的方法實際上需要在不同的課程?還是將它們放在'Test'中更有意義? – mhlester

+0

對不起,我試圖讓問題儘可能簡單,但沒有意識到我帶領人們走錯了方向。它只是一個例子。我需要變量在類之外。 – user220201

-1

我建議:

class CallCount(object): 
    def __init__(self, start=0): 
     self.count=start 
    def __call__(self): 
     self.count+=1 
     return self.count 

然後使用這樣說:

>>> c=CallCount() 
>>> c() 
1 
>>> c() 
2 
>>> c() 
3 
+0

這與使用全局關鍵字(如jeremy上面建議的)有什麼不同? – user220201

+0

如果您希望接口成爲呼叫類型或遞增屬性,請確定。 – dawg

+0

「訪問在類之外聲明的變量」它不回答他的問題,讓他在構造函數中重新初始化變量。 – jeremyjjbrown

0

這個怎麼樣方式:不正確的方式做,但根據你的問題:

Count = 0 

class Test: 
    def Inc(self): 
     Count = globals()['Count'] 
     Count = Count + 1 
     print 'Count = ' + str(Count) 

def main(): 
    t = Test() 
    t.Inc() 

if __name__ =='__main__': 
    main() 
0

計數加1本身。但是,它不知道它是什麼,因爲你從來沒有初始化過它。

class Test: 
    def __init__(self): 
     self._count = 0  #Starting point 

    def Inc(self): 
     self._count = self._count + 1 
     print 'Count = ' + str(self._count) 

編輯以匹配評論:

class Test: 
    def __init__(self, c): 
     self._count = c 

    def inc(self): 
     self._count = self._count + 1 
從主

然後()或其它地方:

c = 0 
t = Test(c) 
t.inc() 
+0

請參閱對問題的編輯。我有兩個類,並且我想在類 – user220201

+0

的一個類中使用Count函數。你打開一罐蠕蟲。您將需要考慮用例,例如你需要線程安全嗎?如果不是,那麼最簡單的方法就是將「Count」作爲構造函數參數傳遞給這兩個類。 – Will

+0

真棒的想法。在這種情況下,我也不必擔心線程問題。我會牢記這一點。 – user220201