2011-11-03 101 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'现在与原始实例无关。您可以指定任何您喜欢的内容,但不会影响实例。 –