self 和 not self 对象之间有什么区别,特别是在 Tkinter class 中?

What is the difference between self and not self objects particularly in Tkinter class?

我有这个带有 self.btn1 的简单代码

from tkinter import Tk, ttk, messagebox
import tkinter as tk

class Main(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.btn1 = ttk.Button(self, text="test")
        self.btn1.pack()

if __name__ == "__main__":
    root = tk.Tk()
    app = Main(root)
    app.pack()
    root.mainloop()

并且这段代码没有自己的按钮

from tkinter import Tk, ttk, messagebox
import tkinter as tk

class Main(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        btn1 = ttk.Button(self, text="test")
        btn1.pack()

if __name__ == "__main__":
    root = tk.Tk()
    app = Main(root)
    app.pack()
    root.mainloop()

两者的工作原理相似,但有什么区别,我应该使用哪一个?

唯一真正的区别在于在需要时检索对 Button 实例的引用是多么容易。对于前者,它只是 app.btn1。对于后者,它是 app.winfo_children()[0].

>>> app.winfo_children()[0] is app.btn1
True

区别在于btn1是一个局部变量,只在使用它的函数中可用。 self.btn1 是一个实例变量,可用于 class.

中的每个函数