我不明白为什么以下代码在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) )
答案 0 :(得分:0)
实际答案:在创建uic.loadUi
后,将die
电话移至。
对代码的评论:
QMainWindow
一次而是super
一次)%s
时,您也不需要致电str()
- 这是%s
所做的事。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