2013-03-21 93 views
0

在研究關於python類屬性和實例屬性時,我開始知道無法在對象方法之外創建對象屬性(或者可能是類方法)。像下面的代碼將在Python中生成一個「NameError」。爲什麼無法在對象方法之外創建對象屬性?

class test(object): 
    def __init__(self): 
     self.lst = [] 
    self.str = 'xyz' 

爲什麼python不允許這樣做?我不質疑語言創作者的決定,但背後的任何理由。就像,這在技術上是不正確的還是這種行爲的其他缺點。

回答

5

您正在定義一個類,因此沒有實例指向外部方法。降了`自:

class test(object): 
    def __init__(self): 
     self.lst = [] 
    str = 'xyz' 

self指向實例,而不是類。您需要創建一個實例並直接指定屬性(test().str = 'xyz'您需要在方法內部(當self實際上可以引用實例時)。

+0

這是否意味着類甚至在被調用之前或者在創建該類的任何實例之前都被解釋器解析,這與函數中的錯誤不會影響程序,除非該函數被調用的函數不同? – Alinwndrld 2013-03-21 11:28:30

+0

@Alinwndrld:解釋器在找到'class'語句時創建類對象,是的。添加一個'print'到課程主體來查看。類也是對象;你可以傳遞'test'類,你可以引用其中定義的屬性等。爲了讓Python能夠做到這一點,它需要首先執行類體來創建類對象。 – 2013-03-21 11:29:58

0

self不是蟒蛇一個特殊的名字,如果你願意,你可以使用\

class test(object): 
    def __init__(foo): 
     foo.lst = [] 

。每個類的方法都將顯式傳遞給它的實例作爲第一個參數,您可以隨意調用它。嘗試訪問方法範圍之外的參數顯然不起作用。