gpt4 book ai didi

python - AttributeError,声称一个明明存在的属性不存在。为什么我得到它? (子类问题)

转载 作者:太空宇宙 更新时间:2023-11-04 04:43:24 24 4
gpt4 key购买 nike

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

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__)在导致错误的行之前,所以我可以看到哪些属性 did 存在。我很惊讶地看到, '_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__ , 这样我就可以确定它确实存在。

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

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

最佳答案

那是痛苦的。

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

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

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,),),)

这可能不是最好的方法,但它修复了错误。

关于python - AttributeError,声称一个明明存在的属性不存在。为什么我得到它? (子类问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50137248/

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