这让我感到疯狂:
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()
答案 0 :(得分:1)
为什么方法the_method(self,button)引用两个独立的方法 self.button的实例取决于什么对象调用它?
它不依赖于调用者:您每次都明确创建一个新的按钮实例(例如Buttons().hbox
创建一个新实例并从中获取hbox)。
如何显式引用对象实例?
您已经引用了一个实例,每次只是一个新实例。这两个调用将按预期在同一个实例上调用该方法:
my_buttons = Buttons();
my_buttons.the_method();
my_buttons.the_method();
在每种面向对象的语言中都是一样的,所以任何OO教程都可能有用,但http://docs.python.org/tutorial/classes.html可能有助于理解类在python中的工作方式。
答案 1 :(得分:-1)
self.button仅引用同一个对象,该对象是在侦听器类的实例中声明的按钮变量。
使用像“self”这样的关键字对象前缀在OOP中非常典型。如果你来自C#/ java后台,你必须知道“this”或“Me”关键字,如果你曾经学过Visual Basic。 区分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)