这段代码抛出了一个由类引起的错误,我得到了这个错误:
AttributeError: 'My_Data' object has no attribute 'Other'
错误位于行My_Dictionary[row[0]].Other.append(row[3])
中
这个问题当然与类有关,因为在以下情况下,此代码可以正常工作:我使用它时没有使用Page1类,而是只使用My_Data类(init中没有self)。我已经尽可能地减少和简化了代码,删除了无用但明显的部分来解决问题。谢谢
我该怎么修?谢谢
class Page1(tk.Frame):
def __init__(self, master, other, **kw):
super().__init__(master, **kw)
self.configure(bg='white')
class My_Data():
def __init__(self, Name, Year, Other):
self.Name: str
self.Year: float
self.Other: list[int]
def function1(self):
My_Dictionary = {}
x = cursor.execute("sql")
for row in x.fetchall():
if row[0] not in My_Dictionary:
Data = My_Data(
Name=row[1],
Year=row[2],
Other=list())
My_Dictionary[row[0]] = info
My_Dictionary[row[0]].Other.append(row[3])
print(My_Dictionary)
更新我以前运行良好的代码,如果:我在没有Page1类的情况下使用它,但只使用My_Data类(init中没有self):
class My_Data:
Name: str
Year: float
Other: list[int]
def function1():
My_Dictionary = {}
x = cursor_test.execute("sql")
for row in x.fetchall():
if row[0] not in My_Dictionary:
info = My_Data(
Name=row[1],
Year=row[2],
Other=list())
My_Dictionary[row[0]] = info
My_Dictionary[row[0]].Other.append(row[3])
print(My_Dictionary)
3条答案
按热度按时间zf9nrax11#
self.Name: str
是不执行任何操作的注解;你的构造函数没有设置任何字段,因此“没有属性”。你可以用self.Name: str = Name
来赋值它们,但是...dataclass
更容易,它会为您计算出构造函数。Data
和info
就不一样了,IDE应该突出显示其中一个未使用,这应该已经是您做错了什么的一个线索。总而言之:
jgzswidk2#
您所询问的特定问题是由
MyData
类的__init__
方法实际上不执行任何操作这一事实引起的。这些语句是类型提示,实际上并没有给类的示例赋值任何属性。你可以保留它们,因为类型提示很有用,但是它们应该在任何方法之外定义,并且不带
self
。如果你正在使用类型提示,也可以把它们放在__init__
的参数上。所以你需要这样的东西:
(Note我将
Year
更改为整数。)sg2wtvxw3#
您看到的错误是AttributeError,这意味着您试图访问其属性或方法的对象没有该属性。在本例中,错误消息指出My_Data对象没有属性Other。
问题似乎是你试图访问;My_Dictionary[行[0]].Other.append(行[3]),但Other不是My_Data类的适当对象。
您似乎已在类“My_Data”的构造函数中定义了“Other”属性,但在function 1中,您尝试将其作为对象的属性而不是类的属性进行访问。