Python 我什么时候可以省略自我

Python 我什么时候可以省略自我,python,class,tkinter,self,Python,Class,Tkinter,Self,我发现了这个简单tkinter类的示例。 该示例适用于以下两种情况: “frame”或“self.frame” 为什么我可以或会安全地省略“self” from Tkinter import * class App: def __init__(self, master): frame = Frame(master) frame.pack() self.button = Button( frame, text=

我发现了这个简单tkinter类的示例。 该示例适用于以下两种情况:

“frame”或“self.frame”

为什么我可以或会安全地省略“self”

from Tkinter import *

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(
            frame, text="QUIT", fg="red", command=frame.quit
            )
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)

    def say_hi(self):
        print "hi there, everyone!"

root = Tk()

app = App(root)

root.mainloop()
root.destroy() # optional; see description below

在大多数情况下,除了
self之外,您可以省略
self
。说“嗨”
。否则,
say_hi
引用全局函数,而不是方法

def __init__(self, master):
    frame = Frame(master)
    frame.pack()

    button = Button(frame, text="QUIT", fg="red", command=frame.quit)
    button.pack(side=LEFT)

    hi_there = Button(frame, text="Hello", command=self.say_hi)
    hi_there.pack(side=LEFT)

self.frame
/
frame
只要frame对象仅在方法中引用,就可以使用这两种方法。如果在另一种方法中使用,则应将其限定为
self.frame

在大多数情况下,除了
self之外,您可以省略
self
。否则,
say_hi
引用全局函数,而不是方法

def __init__(self, master):
    frame = Frame(master)
    frame.pack()

    button = Button(frame, text="QUIT", fg="red", command=frame.quit)
    button.pack(side=LEFT)

    hi_there = Button(frame, text="Hello", command=self.say_hi)
    hi_there.pack(side=LEFT)

self.frame
/
frame
只要frame对象仅在方法中引用,就可以使用这两种方法。如果在另一种方法中使用,则应将其限定为
self.frame

在大多数情况下,除了
self之外,您可以省略
self
。否则,
say_hi
引用全局函数,而不是方法

def __init__(self, master):
    frame = Frame(master)
    frame.pack()

    button = Button(frame, text="QUIT", fg="red", command=frame.quit)
    button.pack(side=LEFT)

    hi_there = Button(frame, text="Hello", command=self.say_hi)
    hi_there.pack(side=LEFT)

self.frame
/
frame
只要frame对象仅在方法中引用,就可以使用这两种方法。如果在另一种方法中使用,则应将其限定为
self.frame

在大多数情况下,除了
self之外,您可以省略
self
。否则,
say_hi
引用全局函数,而不是方法

def __init__(self, master):
    frame = Frame(master)
    frame.pack()

    button = Button(frame, text="QUIT", fg="red", command=frame.quit)
    button.pack(side=LEFT)

    hi_there = Button(frame, text="Hello", command=self.say_hi)
    hi_there.pack(side=LEFT)

self.frame
/
frame
只要frame对象仅在方法中引用,就可以使用这两种方法。如果在另一种方法中使用,则应将其限定为
self.frame

一般来说,使用像
frame
这样的局部变量比使用像
self.frame
这样的对象属性更有效。只有在创建对象的方法返回后需要能够引用该对象时,才应该使用对象属性


在Python中,存储在局部变量中的对象在函数或方法返回后会被垃圾收集,但这不是问题。帧对象本身将是持久的,因为它链接到传递给
\uuu init\uuu()

的主对象。通常,使用像
Frame
这样的局部变量比使用像
self.Frame
这样的对象属性更有效。只有在创建对象的方法返回后需要能够引用该对象时,才应该使用对象属性


在Python中,存储在局部变量中的对象在函数或方法返回后会被垃圾收集,但这不是问题。帧对象本身将是持久的,因为它链接到传递给
\uuu init\uuu()

的主对象。通常,使用像
Frame
这样的局部变量比使用像
self.Frame
这样的对象属性更有效。只有在创建对象的方法返回后需要能够引用该对象时,才应该使用对象属性


在Python中,存储在局部变量中的对象在函数或方法返回后会被垃圾收集,但这不是问题。帧对象本身将是持久的,因为它链接到传递给
\uuu init\uuu()

的主对象。通常,使用像
Frame
这样的局部变量比使用像
self.Frame
这样的对象属性更有效。只有在创建对象的方法返回后需要能够引用该对象时,才应该使用对象属性


在Python中,存储在局部变量中的对象在函数或方法返回后会被垃圾收集,但这不是问题。帧对象本身将是持久的,因为它链接到传递给
\uuuu init\uuuu()
的主对象,您可以在
之前忽略
self
,因为您将引用传递到
按钮
,该按钮存储为
self.Button
(大概是
按钮
为您保存对框架的引用)

这确保了当您超出
\uuuuu init\uuuuu
的范围时,不会对您的
帧进行垃圾收集,因为只有未在任何地方引用的对象才会被销毁

在本例中,您在
self.button
之外没有使用
frame
,因此在
self.frame
中存储对它的额外引用没有意义


如其他答案中所述,如果您想稍后直接引用与对象实例相关的内容,您只需要
self

您可以在
frame
之前省略
self
,因为您将引用传递到
按钮
,该按钮存储为
self.Button
(大概是
按钮
为您保存对框架的引用)

这确保了当您超出
\uuuuu init\uuuuu
的范围时,不会对您的
帧进行垃圾收集,因为只有未在任何地方引用的对象才会被销毁

在本例中,您在
self.button
之外没有使用
frame
,因此在
self.frame
中存储对它的额外引用没有意义


如其他答案中所述,如果您想稍后直接引用与对象实例相关的内容,您只需要
self

您可以在
frame
之前省略
self
,因为您将引用传递到
按钮
,该按钮存储为
self.Button
(大概是
按钮
为您保存对框架的引用)

这确保了当您超出
\uuuuu init\uuuuu
的范围时,不会对您的
帧进行垃圾收集,因为只有未在任何地方引用的对象才会被销毁

在本例中,
frame
self.button
之外没有任何用处,因此没有必要存储额外的