python-3.x 类和函数中的类,AttributeError:“My_Data”对象没有“其他”属性

eagi6jfj  于 2023-01-27  发布在  Python
关注(0)|答案(3)|浏览(153)

这段代码抛出了一个由类引起的错误,我得到了这个错误:

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

zf9nrax11#

  • 不要使用嵌套类,除非你真的需要并且知道如何使用。
  • self.Name: str是不执行任何操作的注解;你的构造函数没有设置任何字段,因此“没有属性”。你可以用self.Name: str = Name来赋值它们,但是...
  • ...使用dataclass更容易,它会为您计算出构造函数。
  • 那么Datainfo就不一样了,IDE应该突出显示其中一个未使用,这应该已经是您做错了什么的一个线索。

总而言之:

import dataclasses

@dataclasses.dataclass
class My_Data:
    Name = str
    Year = float
    Other: list

class Page1(tk.Frame):
    def __init__(self, master, other, **kw):
        super().__init__(master, **kw)
        self.configure(bg="white")

    def function1(self):
        My_Dictionary = {}
        x = cursor.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)
jgzswidk

jgzswidk2#

您所询问的特定问题是由MyData类的__init__方法实际上不执行任何操作这一事实引起的。

class My_Data():
    def __init__(self, Name, Year, Other):
        self.Name: str
        self.Year: float
        self.Other: list[int]

这些语句是类型提示,实际上并没有给类的示例赋值任何属性。你可以保留它们,因为类型提示很有用,但是它们应该在任何方法之外定义,并且不带self。如果你正在使用类型提示,也可以把它们放在__init__的参数上。
所以你需要这样的东西:

class My_Data():

    Name: str
    Year: int
    Other: list[int]

    def __init__(self, Name: str, Year: int, Other: list[int]):
        self.Name = Name
        self.Year = Year
        self.Other = Other

(Note我将Year更改为整数。)

sg2wtvxw

sg2wtvxw3#

您看到的错误是AttributeError,这意味着您试图访问其属性或方法的对象没有该属性。在本例中,错误消息指出My_Data对象没有属性Other。
问题似乎是你试图访问;My_Dictionary[行[0]].Other.append(行[3]),但Other不是My_Data类的适当对象。
您似乎已在类“My_Data”的构造函数中定义了“Other”属性,但在function 1中,您尝试将其作为对象的属性而不是类的属性进行访问。

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):
            self.Name: Name
            self.Year: Year
            self.Other = []
            
    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])

                My_Dictionary[row[0]] = Data
            My_Dictionary[row[0]].Other.append(row[3])
         print(My_Dictionary)

相关问题