为了账号安全,请及时绑定邮箱和手机立即绑定

将大文件拆分为模块时出现循环导入问题

将大文件拆分为模块时出现循环导入问题

拉莫斯之舞 2023-09-19 14:16:29
我是约翰,我是一名新程序员!这是我在此的头一篇博文!我最近使用 Tkinter 创建了一个 Python 程序。该程序允许用户将一些数据插入数据库并创建 .docx 文件。它还允许执行简单的数据库搜索。在编码过程中,我从未想到源代码会这么长,但我已经使用基于(相对)相似性分组为类的方法编写了它。因此,过了一段时间,我决定将代码拆分为多个模块,每个模块由一个类组成,这会是更明智的做法。它更多地是为了可读性而不是可重用性,因为在我看来,大多数类和方法都是针对该程序的。问题似乎是其中两个类确实相互依赖,并且我不断收到:AttributeError: partially initialized module 'main_app' has no attribute 'Main' (most likely due to a circular import)我将演示这两个类的部分内容,以展示两者如何相互依赖。main_app.py:import databaseclass Main():    ..    def create_widgets(self):     ..        self.f5 = tk.Frame(self.search_tab, bg="lightyellow", padx=5, pady=5)        self.f5.pack(expand=True, fill='both')        self.delete_button = ttk.Button(self.f5, text='Διαγραφή', command=data.delete_from_database, state='disabled')        self.delete_button.pack(side='right', fill='both')        self.edit_button = ttk.Button(self.f5, text='Επεξεργασία', command=data.update_entry_retrieve, state='disabled')        self.edit_button.pack(side='right', fill='both')        ..if __name__ == "__main__":    root = tk.Tk()    data = database.Database()    main = Main(root)    root.mainloop()此代码块显示了 Main 类如何使用 Database 类(实例化为数据)的方法。database.py:..import main_appclass Database():    ..    def save_to_database(self):        sql = f'INSERT INTO entries VALUES (?,?,?,?,?,?,?,?,?,?,?,?);'        try:            con = lite.connect(self.db)            with con:                cur = con.cursor()                cur.execute(sql, (main.id_number, main.surname, main.name, main.reason, main.office_article, main.office_type, main.office_name, main.protocol_num,\                     main.protocol_date, main.other_doc_passport, main.other_doc_driver, main.timestamp))                cur.execute('COMMIT;')            return True        except Exception as e:            print(e)            return False        ..main = main_app.Main()这段代码数据库如何访问主类的变量。完整的代码可以在项目“split”存储库中找到。是否有一个我看不到的简单解决方案,或者应该完全重写代码以减少我的类的依赖性?不管怎样,我花了昨天整个下午的时间来寻找解决方案,但在绕圈子时,就像我的导入一样。我尝试改变模块的导入方式,但完全没有改变。恐怕代码太混乱,无法拆分。
查看完整描述

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

在database.py中,不要导入main_app,而是:


class Database:

    def __init__(self, main):

        self.main = main

create_widgets在 main_app.py 中,从构造函数中删除。然后:


main = Main(root)

data = database.Database(main)

main.create_widgets()


查看完整回答
反对 回复 2023-09-19
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信