【问题标题】:When can I omit self我什么时候可以省略自己
【发布时间】:2014-12-09 08:40:04
【问题描述】:

我发现了这个简单的 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

【问题讨论】:

    标签: python class tkinter self


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在大多数情况下,您可以省略 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

      【讨论】:

        【解决方案3】:

        您可以在frame 之前省略self,因为您将对它的引用传递给Button,该Button 被存储为self.button(大概Button 为您保存对框架的引用)。

        这可确保在您超出 __init__ 范围时不会对您的 frame 进行垃圾回收,因为只有未在任何地方引用的对象才会被销毁。

        在这个例子中,frameself.button 之外没有用处,所以没有必要在self.frame 中存储对它的额外引用。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-31
          • 2021-11-10
          • 1970-01-01
          • 2010-12-28
          • 2015-05-11
          • 1970-01-01
          • 2014-01-24
          相关资源
          最近更新 更多