亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將大文件拆分為模塊時出現循環導入問題

將大文件拆分為模塊時出現循環導入問題

拉莫斯之舞 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”存儲庫中找到。是否有一個我看不到的簡單解決方案,或者應該完全重寫代碼以減少我的類的依賴性?不管怎樣,我花了昨天整個下午的時間來尋找解決方案,但在繞圈子時,就像我的導入一樣。我嘗試改變模塊的導入方式,但完全沒有改變??峙麓a太混亂,無法拆分。
查看完整描述

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 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號