2013-11-25 120 views
1

在類中self.var和var之間是否有區別? 例如:python:var vs. self.var(有什麼區別?)

class nameClass: 
    def names(self): 
     self.name1 = "aaaa" 
     name2 = "bbbb" 

    def printNames(self): 
     print self.name1 
     print name2 

現在如果我實例化類,我想用NAME2變量,它不會讓我。

obj1 = nameClass() 
obj.printNames() 

將打印NAME1但對於NAME2它說:

NameError: global name 'name2' is not defined 

,所以我承擔,我們只使用最好是不要使用「自我」 的方法內,但變量其他變量,我們稍後要修改或將它們傳遞給其他方法,最好使用'self'。

還有其他區別嗎?

enter image description here

回答

6
class Foo: 
    name1 = 'class variable' 

    def __init__(self): 
     self.name2 = 'instance variable' 
     name3 = 'local variable' 

    def test(self): 
     print self.name1 # ok 
     print self.name2 # ok 
     print name3  # no 

這裏有一個相關的帖子:Static class variables in Python

+0

可能要選擇一個不同的名稱爲您'print'方法,因爲當前將拋出一個'SyntaxError'。 ;) – iCodez

+0

@iCodez ..對不起,fogot'print'是保留的。在腳下拍攝自己 – gongzhitaao

2

name2 = "bbbb"變量將是當地唯一的方法names。名稱將在您設置後和您的names方法結束後可見。

但是使用self.name1 = "aaaa"您將爲您的類實例self添加一個屬性,這將爲您的self實例的其他方法所瞭解。

因此,使用self.xyz您需要在班級中存儲更長時間的任何數據,並且需要在方法之間進行訪問,並使用xyz作爲單一方法中的臨時變量。

Offtopic:在使用它之前要小心地初始化每個局部變量。如果你沒有,你可以在較低級別有一個同名(全局)變量,你會使用它的值,而你的代碼會搞砸。

當使用像name1這樣的屬性時,請小心也不要忽略self,因爲您可以再次使用全局變量name1,您可以改爲在類方法中讀取它。

在於向世人證明這個討厭的錯誤:

def test(): 
    # forgot to initialize constant/variable x 
    print x 

x = 1 
test() 

class CTest: 
    def __init__(self): 
     self.x = 5 

    def wrongx(self): 
     print x 

t = CTest() 
t.wrongx() 

這個測試的結果應該是:

1 
1 
相關問題