【发布时间】:2012-11-10 11:02:49
【问题描述】:
我有一个特殊的 python 问题。在我的 gtk python 应用程序执行过程中,我的一些类对象神秘地丢失了属性,导致我的程序的一些功能中断。
很难说明为什么会发生这种情况 - 我从不故意删除属性,并且相关类继承自我自己(而不是其他人)编写的类。
我可以通过重复执行某个操作来触发问题(例如生成对add_card 方法的多次调用 - 通过疯狂点击或打开文件,导致add_card 被调用二十次左右)
我真的很茫然,我希望我有更多我认为有用的信息可以给你。
什么会导致 python 对象丢失属性?
编辑,重新。问题:
以下是与我“丢失”的两个属性相关的示例回溯:
Traceback (most recent call last):
File "lib/genericlist.py", line 90, in cursor_changed
if self.viewer:
AttributeError: 'DeckerRunnerList' object has no attribute 'viewer'
Traceback (most recent call last):
File "lib/genericlist.py", line 100, in row_activated
selection = self.TABLE_NAME+"&&"+text
AttributeError: 'DeckerRunnerList' object has no attribute 'TABLE_NAME'
这是设置它们的位置:
class DeckerGenericList(object):
def __init__(self, database, viewer=None, deck=None):
super(DeckerGenericList, self).__init__()
self.database = database
self.viewer = viewer
self.deck = deck
#TABLE_NAME is set in the subclass constructor
这个特定的子类不称其为超类__init__,因此属性集在子类中重复:
class DeckerRunnerList(DeckerGenericList):
def __init__(self, database, viewer=None, deck=None):
self.database = database
self.viewer = viewer
self.deck = deck
self.TABLE_NAME = "runners"
DeckerGenericList 的所有其他子类都有相同的问题,它们都是这样定义的:
class DeckerGearList(DeckerGenericList):
def __init__(self, database, viewer=None, deck=None):
self.TABLE_NAME = "gear"
#... some other class attributes
super(DeckerGearList, self).__init__(database, viewer=viewer, deck=deck)
【问题讨论】:
-
你在使用线程吗?你能显示一些代码吗?
-
DeckerRunnerList定义在哪里? -
FWIW,
self.TABLE_NAME应该是类属性,而不是实例属性 -
发布一个实际使用类并引发该错误的示例代码。可能是显示行为的最小示例。没有这个,我们怎么知道你在做什么?
-
看起来它可能有明显的 pygtk 风味......看看这个:stackoverflow.com/questions/5346578/…