AttributeError,声称明显存在的属性不存在。为什么我会得到它?(与子类一起发布)

2024-05-19 01:41:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在我一直从事的一个大型程序中,我遇到了一个属性错误:

line 154, in __ExtINT
    DebugVar=Self.__Preset # Originally, I had Self.__Preset directly in an if statement. I added this line and put DebugVar in the if statement, so I could be sure what was causing the error.
AttributeError: '__Readitem' object has no attribute '_ReadItem__Preset'

我确信它是在__init__函数中设置的,并花了一段时间试图找出为什么会出现这个错误。当我发现python使用一个字典来存储它的所有变量时,所以我把print(Self.__dict__)放在导致错误的行之前,这样我就可以看到存在哪些属性了。我很惊讶地在字典里看到, '_Readitem__Preset': True}。为什么它说它不存在,在错误中呢?你知道吗

我尝试了DebugVar=Self.__dict__['_Readitem__Preset']而不是DebugVar=Self.__Preset,得到了:

line 154, in __ExtINT
    DebugVar=Self.__dict__['_Readitem__Preset']
KeyError: '_Readitem__Preset'

然后我试着把self.__Preset=False直接放在__init__后面,这样我就可以确定它确实存在。你知道吗

值得一提的是,在我尝试手动从变量中提取值之前,显示了两个字典,这意味着最初代码只工作一次。我更改代码后,只显示了一个字典。你知道吗

有没有人自己遇到过这个问题,或者知道为什么会这样?你知道吗


Tags: theinselfif字典属性init错误
1条回答
网友
1楼 · 发布于 2024-05-19 01:41:12

那很痛苦。你知道吗

我已经设法弄清楚了为什么会出现错误并修复了代码。以下是我如何得到错误的描述,以及我如何克服它,以防有人好奇,或自己得到这个错误:

在我的代码中,我有一个基本上是一个类别的类。它存储属性,例如它是预定义的还是用户定义的,它是否包含任何子类别,它可能拥有的任何子类别,等等。。这些子类别是包含该类的更多实例的列表。然后,我不得不创建它的另一个版本,在初始化时写入文件。如果我像以前一样这样做,那么它会将只应写入文件一次的数据写入文件,多次写入文件。我决定创建一个“子类”,它的工作方式与主类略有不同。下面是一些简单的代码,展示了我试图实现的结构:

class Main():
    class __Sub():
        def __init__(self,file,dat):
            if isinstance(dat,tuple):
                self.__trace=()
                if False in (isinstance(i,int)for i in dat):self.__trace+=tuple((Main.__Sub(file,i),)for i in dat)
                else:
                    self.__trace=dat
                    file.write(bytes(dat))
            else:
                self.__trace=(dat,)
                file.write(bytes([dat]))
    def __init__(self,file,dat):
        File=open(file,"wb")
        self.__trace=()
        self.__trace+=tuple((Main.__Sub(File,i),)for i in dat)
        File.close()
Main(input("Enter file name: "),(4,8,((32,71),255)))

正如我在问题中所说的,python将其变量存储在字典中,您可以使用.__dict__检查对象的属性。如果这样做,您将看到每个属性都有其类的名称作为前缀。如果您尝试运行上面的代码,那么由于某种原因,它将崩溃,因为它试图使用错误的前缀来查找属性。你知道吗

我的解决方案是删除子类,并对我的代码执行以下操作:

class Main():
    def __init__(self,file,dat):
        if "BadPractice" in globals():
            if isinstance(dat,tuple):
                self.__trace=()
                if False in (isinstance(i,int)for i in dat):self.__trace+=tuple((Main(file,i),)for i in dat)
                else:
                    self.__trace=dat
                    file.write(bytes(dat))
            else:
                self.__trace=(dat,)
                file.write(bytes([dat]))
        else:
            global BadPractice
            BadPractice=None
            self.__trace=()
            self.__trace+=tuple((Main(file,i),)for i in dat)
            file.close()
Main(open(input("Enter file name: "),"wb"),(4,8,((32,71,),255,),),)

这可能不是最好的方法,但是它修复了这个bug。你知道吗

相关问题 更多 >

    热门问题