Python 自我对象和非自我对象之间有什么区别,特别是在Tkinter类中?

Python 自我对象和非自我对象之间有什么区别,特别是在Tkinter类中?,python,class,object,tkinter,self,Python,Class,Object,Tkinter,Self,我有一个简单的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_

我有一个简单的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()
这个代码没有self按钮

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

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

唯一真正的区别在于检索对
按钮的引用有多容易,如果您需要的话。对于前者,它只是
app.btn1
。对于后者,它是app.winfo_children()[0]

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

不同之处在于,
btn1
是一个局部变量,仅在使用它的函数中可用
self.btn1
是一个实例变量,在类中的每个函数中都可用。

self
是调用方法的实例。对
self
的赋值(不管第一个位置参数是什么,通常只称为
self
)将创建实例属性。