OOP 设计问题 - 'postulantet' 对象没有属性 'tabla_postulante'

Posted

技术标签:

【中文标题】OOP 设计问题 - \'postulantet\' 对象没有属性 \'tabla_postulante\'【英文标题】:OOP design issue - 'postulantet' object has no attribute 'tabla_postulante'OOP 设计问题 - 'postulantet' 对象没有属性 'tabla_postulante' 【发布时间】:2021-02-14 16:20:26 【问题描述】:

我在使用 tkinter 和面向对象编程时遇到问题。 我有 3 个功能:

    首先我有v2() 函数,该函数允许通过按钮打开第二个窗口并显示保存在数据库中的数据

    我的第二个函数是agregar_postulantes()。该函数将数据保存在数据库中。

    我的第三个函数是保存agregar_postulantes()的数据并将其发送到v2()函数。

我想强调的是,所有函数都在同一个类中,并且在__init__()之外声明。

代码的简短版本:

def v2(self):
    self.tabla_postulante=ttk.Treeview(tablaBD,columns=("Name","last name","id")
    self.tabla_postulante.heading("Name",text="Name")
    self.tabla_postulante.heading("last name",text="last name")
    self.tabla_postulante.heading("id",text="id")

    self.tabla_postulante['show']='headings'
    self.tabla_postulante.column("Name",width=100)
    self.tabla_postulante.column("last name",width=100)
    self.tabla_postulante.column("id",width=100)
    self.fetch_all()
    self.tabla_postulante.pack(fill=BOTH,expand=1)

def agregar_postulantes(self):
    con = pymysql.connect(host="localhost", user="root",password="", database="postulantebd")
    cur = con.cursor()
    cur.execute("insert into postulantes values(%s, %s, %s)",(
            self.name_var.get(),
            self.lastname_var.get(),
            self.id_var.get(),
            ))
    con.commit()
    self.fetch_all()
    con.close()

def fetch_all(self):
    con = pymysql.connect(host="localhost", user="root",password="", database="postulantebd")
    cur = con.cursor()
    cur.execute("select * from postulantes")
    rows=cur.fetchall()
    if len(rows)!=0:
        self.tabla_postulante.delete(*self.tabla_postulante.get_children())
        for row in rows:
            self.tabla_postulante.insert('',END,values=row)
        con.commit()
    con.close()

出现的错误如下:

Traceback (most recent call last):
  File "C:\Users\dimitri\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\dimitri\Documents\Programas de Yolo\practicadeinterfazypoo\tkinter\interfaz_tesis_poo.py", line 273, in agregar_postulantes
    self.fetch_all()
  File "C:\Users\dimitri\Documents\Programas de Yolo\practicadeinterfazypoo\tkinter\interfaz_tesis_poo.py", line 282, in fetch_all
    self.tabla_postulante.delete(*self.tabla_postulante.get_children())
AttributeError: 'postulante' object has no attribute 'tabla_postulante'

错误是因为我在使用其他两个函数保存数据后调用了 v2 函数 之后如何调用v2 函数而不显示错误?

【问题讨论】:

您需要调用v2,它会在其他使用它的方法之前创建tabla_postulante。从这个例子中不清楚是否进行了该调用。 错误信息是否不清楚?例如,您了解attribute 是什么吗? 我认为tabla_postulante是v2中声明的属性。 【参考方案1】:

正如AttributeError 所述,self 似乎没有tabla_postulante 属性。由于您在 v2 函数中的 self 上创建了 table_postulante 属性,我猜您没有在 __init__() 中定义 self.table_postulante 或者您在调用 @ 之前没有调用 v2() 987654330@.

应该意味着你有几个选择:

    fetch_all() 中创建一些逻辑来检查self.tabla_postulante 的存在,并且仅在找到该属性时执行。这可以采取try/except 声明的形式。

    或者,在实例化对象时,在对 __init__() 的调用中定义 self.tabla_postulante 属性。

更新

关于实现我上面描述的内容的更多细节。我将假设您没有在 __init__() 中的类上创建 self.tabla_postulante 属性,因为如果您是这样,当函数查找它时,您不会得到 ValueError

因此,这为您提供了几个选择。一种方法是简单地确保当您实例化您的类时,__init__() 创建一个 self.table_postulante 属性,如下所示:

class ClassName:
    def __init__(self):
        #create attribute here
        self.table_postulante = ttk.Treeview(tablaBD,columns=("Name", "last name","id")
        ...

如果这对您正在开发的应用程序没有意义,另一种选择是在fetch_all() 中进行一些异常处理。例如,您可以执行以下操作:

if len(rows)!=0:
    try:
        self.tabla_postulante.delete(*self.tabla_postulante.get_children())
        for row in rows:
            self.tabla_postulante.insert('',END,values=row)
        con.commit()
    except:
        #define some appropriate response to this attribute not existing here

您的用例当然会决定哪种方法最有意义。希望这会有所帮助。

【讨论】:

你是对的,我在使用第一个函数之前调用了第二个和第三个函数。你能对验证更具体一点吗?我是初学者 绝对!我会把它放在答案中,这样我就可以利用 Markdown 让它变得漂亮。

以上是关于OOP 设计问题 - 'postulantet' 对象没有属性 'tabla_postulante'的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript oop:正确设计类

Haskell 演示 OOP 设计模式的等价物 [重复]

OOP DAO 设计问题

PHP OOP 数据库设计

什么是OOP

基于 CSP 的设计思想和 OOP 设计思想的异同