我有一个奇怪的Python问题。在执行我的GTK Python应用程序的过程中,我的某些类对象会神秘地丢失属性,导致程序的一些功能出现问题。
很难说出发生这种情况的原因 - 我从未有意删除属性,而且涉及到的类都是继承自我自己编写的类(和其他类没有关系)。
我可以通过重复执行某个操作来触发该问题(例如通过疯狂点击或打开文件生成多次调用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__
,因此属性集在子类中是重复的:
这个特定的子类没有调用其父类的__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
定义在哪里? - Ericself.TABLE_NAME
应该是一个类属性,而不是实例属性。 - Eric