尽管可以打印,但Python __init__ self属性不可用

时间:2018-03-27 04:53:48

标签: python

它整天都很好地突然停了下来。我不相信我改变了代码,也许我的大脑停止了工作???

class BorderWidgetWithLabel(BorderWidget): 

    def __init__(self, **kwargs):
        super(BorderWidgetWithLabel, self).__init__(**kwargs)

        self.text=" "
        self.text=kwargs.get('text',' ')
        print self.text
        self.txt_bg_color=kwargs.get("txt_bg_color", [0,0,0,0])
        self.bg_color=kwargs.get("bg_color", [0,0,0,0])

        self.bind(pos=self.update_canvas)
        self.bind(size=self.update_canvas)
        self.update_canvas()


    def update_canvas(self, *args):
        #need to reset everything
        self.canvas.clear()

        with self.canvas:

            get_color(self.border_color)
            if(self.text!=""):
                texture=simple_text_texture(self.text)

问题:

/typeclasses/borderwidget.py", line 75, in update_canvas
if(self.text!=""):
AttributeError: 'BorderWidgetWithLabel' object has no attribute 'text'

我开始收到错误,我在self.text=" "中添加了__init__以及在update_canvas中添加了if语句。我做错了什么?

如果我摆脱了self.text的所有用途,那么print self.text没有问题。

UPDATE ::通过添加text =''作为类变量来修复。这有必要??或者代码有问题。由于 init 中的print self.text在没有类变量的情况下工作正常,我无法提供不太完整的样本

UPDATE ::我删除了 init 的self.update_canvas()最后一行,它没有使用类变量,但是我尝试使用以下内容重现它​​

class SomeClass:
def __init__(self, **kwargs):
    self.text=kwargs.get("text","hello")
    self.update_class()


def update_class(self, *args):
    if(self.text!=' '):
        print self.text



SomeClass()

我不知道为什么我无法再现它

1 个答案:

答案 0 :(得分:1)

所以,看起来你有

class BW:
  def __init__(self):
    self.update_canvas()

  def update_canvas(self):
    pass

class BWL(BW):
  def __init__(self):
    super(BWL, self).__init__()
    self.text = 'text'
    self.update_canvas()

  def update_canvas(self):
    print self.text

运行BWL()会抛出您列出的异常。这是因为事件的顺序是

  1. 致电BWL.init
  2. 调用BW.init(使用self = BWL)
  3. 调用self.update_canvas(BWL.update_canvas)
  4. 访问self.text
  5. 然后,当BW.init返回时,它会创建self.text
  6. 最后再次调用self.update_canvas。
  7. 即使没有错误,这可能也不是你想要的...可能会删除对super的调用或对子进程中update_canvas的调用,并在调用超类之前在update_canvas方法中设置所需的属性。 / p>