我什么时候可以省略自己

时间:2014-12-09 08:40:04

标签: python class tkinter self

我找到了一个简单的tkinter类的例子。 该示例适用于

'frame'或'self.frame'

为什么我能安全地省略'自我'?

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

对于大多数情况,您可以省略selfself.say_hi除外。否则,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。如果在另一种方法中使用它,则应将其限定为self.frame

答案 2 :(得分:0)

您可以在self之前省略frame,因为您将对Button的引用传递到self.button,该Button存储为frame(大概__init__拥有引用到你的框架。)

这可确保您frame不会被垃圾收集,因为只有self.button范围之外的对象才会被销毁。

在此示例中,self.frame之外的self没有用,所以在{{1}}中无法存储其他引用。

如其他答案中所述,如果您希望稍后直接引用与对象实例相关的内容,则只需要{{1}}。