0

这让我快疯了:

  • 为什么该方法the_method(self, button)引用两个单独的实例,self.button具体取决于调用它的对象?
  • 如何显式引用对象实例?

谢谢您的帮助


import os, stat, time
import gtk

class Lister(object):

    OPEN_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND_MULTIPLE, gtk.ICON_SIZE_BUTTON)
    CLOSED_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND, gtk.ICON_SIZE_BUTTON)

    def __init__(self, dname = None):
        filename = "foo"
        self.hbox = gtk.HBox()
        self.button = gtk.Button()
        self.button.set_image(self.OPEN_IMAGE)
        self.button.connect('clicked', self.open_file)
        self.hbox.pack_start(self.button, False)

    def open_file(self, button):
        Buttons().the_method("foo")
        # return


class Buttons(object):

    OPEN_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND_MULTIPLE, gtk.ICON_SIZE_BUTTON)
    CLOSED_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND, gtk.ICON_SIZE_BUTTON)


    def __init__(self):

        self.button = gtk.Button() # THIS is the button to modify
        self.hbox = gtk.HBox()
        self.hbox.pack_start(self.button, False)
        self.button.set_image(self.OPEN_IMAGE)

        self.button.connect('clicked', self.the_method)

    def the_method(self, button):
        print vars(self)
        self.button.set_image(self.CLOSED_IMAGE)


class GUI(object):

    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        self.window = gtk.Window()
        self.window.set_size_request(300, 600)
        self.window.connect("delete_event", self.delete_event)

        vbox = gtk.VBox()
        vbox.pack_start(Buttons().hbox, False, False, 1)
        vbox.pack_start(Lister().hbox)

        self.window.add(vbox)
        self.window.show_all()
        return

def main():
    gtk.main()

if __name__ == "__main__":
    GUI()
    main()
4

2 回答 2

1

为什么 the_method(self, button) 方法根据调用它的对象引用 self.button 的两个单独实例?

它不依赖于调用者:您每次都明确地创建一个新的 Buttons 实例(例如Buttons().hbox,创建一个新实例并从中获取 hbox)。

如何显式引用对象实例?

您已经引用了一个实例,它每次都只是一个新实例。正如预期的那样,这两个调用将调用同一实例上的方法:

my_buttons = Buttons(); 
my_buttons.the_method();
my_buttons.the_method();

这在每种面向对象的语言中都是相同的,因此任何 OO 教程都可能会有所帮助,但 http://docs.python.org/tutorial/classes.html可能有助于理解类在 python 中的工作方式。

于 2013-08-12T13:26:40.860 回答
-1

self.button 仅引用一个相同的对象,该对象是在侦听器类的实例中声明的按钮变量。

在对象前面加上像“self”这样的关键字在 OOP 中是非常典型的。如果您来自 C#/java 背景,如果您曾经学习过 Visual Basic,那么您一定知道“this”或“Me”关键字。区分 python 的一件事是它在方法定义中使用 self 关键字,例如:

def the_method(self, button):

添加 self 作为第一个参数告诉 python 将其视为实例方法,因此如果 Buttons 类的对象 foo 存在,您可以立即将此实例方法调用为:

foo.the_method(xyz)

调用时无需在此处传递“self”参数。它只是为了使它成为一个实例方法。另一方面,如果你省略 self 参数,它就会变成你所谓的静态方法,它不链接到特定实例:

def the_method(button):

在这种情况下,无需创建 foo 实例,您可以直接调用:

Buttons.the_method(xyz)
于 2013-08-09T14:45:21.727 回答