类属性未按预期显示

时间:2015-03-25 03:42:10

标签: python python-3.x pyqt5

我不明白为什么以下代码在AttributeError: 'Dice' object has no attribute 'die1'方法中返回错误__str__。我知道我创建了一个,我的调试器将它显示为一个类属性。这(简单)代码有什么问题?

   class Dice(QMainWindow) :
        """A game of Dice."""

        def __init__(self, parent = None):
            """Build a game with two dice."""

            QMainWindow.__init__(self, parent)

            super(Dice, self).__init__(parent)
            uic.loadUi("Dice.ui", self)

            self.die1 = Die()
            self.die2 = Die()
            self.rollButton.clicked.connect(self.rollButtonClickedHandler)


        def __str__( self ):
            """String representation for Dice.
            """
            return "Die1: %s\nDie2: %s" % ( str(self.die1),  str(self.die2) )

2 个答案:

答案 0 :(得分:0)

实际答案:在创建uic.loadUi后,将die电话移至

对代码的评论:

  • 只调用一次构造函数(不是QMainWindow一次而是super一次)
  • 使用%s时,您也不需要致电str() - 这是%s所做的事。
  • 如果仅编写Python3代码,则super调用可能会遗漏Dice, self部分而只是super().__init__(parent)

答案 1 :(得分:0)

正如评论中所述,错误是由于loadUi在设置__str__之前调用类实例上的self(即die1)而引发的。

为什么 uic模块执行此操作的原因是因为它在解析ui文件时收集了大量调试信息,并且包括记录作为传递的对象baseinstance的{​​{1}}参数。

不幸的是,它通过(间接)调用loadUi来执行此操作时可能应该调用__str__。 (或者可能只是在调用python API函数时没有记录调试信息 。命令行界面有开启调试的选项,但似乎这只是控制是否显示记录的信息,而不是首先收集的信息。)

在初始化期间尽可能早地呼叫__repr__当然很自然 - 正如您对loadUi所做的那样。但无论您如何将ui加载到应用程序中,setupUi都将以完全相同的方式生成代码。与uic的唯一区别在于它在运行时对生成的代码调用exec(),而对于loadUi,相同的代码只是作为静态模块导入。

有很多方法可以解决您的问题。就个人而言,我想我可能会选择将pyuic预先初始化为类属性:

die1/die2