gpt4 book ai didi

丢失属性的 Python 类

转载 作者:太空狗 更新时间:2023-10-29 20:28:37 24 4
gpt4 key购买 nike

我有一个特殊的 python 问题。在我的 gtk python 应用程序执行过程中,我的一些类对象神秘地丢失了属性,导致我的程序的一些功能中断。

很难理解为什么会发生这种情况 - 我从来没有故意删除属性,并且相关类继承 self 自己编写的类(而不是其他类)。

我可以通过重复执行某个操作来触发问题(例如生成对 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

这个特定的子类没有调用它的父类(super class) __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)

最佳答案

PyQT(因此也可能是 PyGtk 或其他框架)具有奇怪的行为,实际上在属性代码内/下方某处引发 AttributeError 实际上会使 python 报告该对象上的调用属性不存在。

某处有一个(更官方的)故事说明了为什么会这样(而且实际上是正确且可以理解的行为)。它与在基类上定义的 __getattr__ 有关:其工作原理是,如果调用对象上的属性导致 AttributeError,则调用 __getattr__ 方法。但是该方法不知道实际上没有找到什么“属性”。由于 (PyQt.QObject) __getattr__ 旨在实现“特定”属性,因此它决定引发另一个 AttributeError 提及“被调用”属性。

无论如何,可能的情况是您继承了一个在某处使用 __getattr__ 的对象,并且您自己的属性代码确实调用了(另一个)确实不存在的属性。你可以做些什么来检查这个:

@property
def myproperty:
try:
doStuff..
except AttributeError as e:
print "Got ya! It is withing the attribute:", repr(e)
raise ValueError("Got an AttributeError within my attribute!")

更新/注意:此外,如果您自己在 DeckerGenericList 对象上实现 __getattr__,出于同样的原因,请小心使用它!在 __getattr__ 中提高 AttributeError's 大多数时候会导致像这样看似奇怪的行为。请注意,没有简单的修复方法:“真正的”AttributeError 仅携带一条字符串消息(而不是具体的实际属性名称),但更重要的是:__getattr__ 函数从一开始就看不到原始的 AttributeError。

关于丢失属性的 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13321448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com