2011-11-03 140 views
2

您能幫我找到問題嗎? Python代碼的作品:Python中的初學者類

class ParamWindow: 
    def __init__(self, b): 
     self.a = b 
     print self.a 

params = ParamWindow(8) 
print params.a 

這打印8和8。然後我做:

class ParamWindow: 
    def __init__(self, parent, b): 
     self = wx.Frame(parent = parent, id=-1, title="Parameters") 
     self.a = b 
     print self.a 

params = ParamWindow(None, 8) 
print params.a 

和它說: 「ParamWindow實例沒有屬性 'A'」。爲什麼不呢?我告訴他自己是Frame,然後添加了一個字段「a」(此時沒有錯誤),但當我要求打印它時(錯誤在打印行),它忘記了「a」存在... 我在哪裏錯誤? 謝謝。

回答

6
def __init__(self, parent, b): 
    self = wx.Frame(parent = parent, id=-1, title="Parameters") 

這裏重新分配self,所以你最終沒有參考ParamWindow實例的任何更多!你永遠不應該那樣做!你想達到什麼目的?

self.a = b 

在這裏,你分配到aself,也就是現在的Frame,而不是ParamWindowParamWindow.a永遠不會被定義,你會在稍後得到錯誤。

也許你想繼承Frame?如果是這樣,你的代碼應該看起來像這樣:

class ParamWindow(wx.Frame): 
    def __init__(self, parent, b): 
     # Initialize the superclass (wx.Frame). 
     super(ParamWindow, self).__init__(parent=parent, id=-1, title="Parameters") 
     self.a = b 
     print self.a 
+2

+1。除非你真的知道自己在做什麼,否則不要給自己分配一些東西。 –

+0

是的,但錯誤是在處理「a」時返回的,而不是在任務中。這是正常的嗎?爲什麼它沒有在作業線上表現得不好?總而言之:我應該如何編寫一個額外的字段「a」來獲得一個Frame?謝謝。 –

+0

@AndrewLazarev因爲'self'現在與原始實例無關。您可以指定任何您喜歡的內容,但不會影響實例。 –