0

これは私を文字通り夢中にさせています:

  • メソッドが呼び出すオブジェクトに応じて、メソッドが のthe_method(self, button)2 つの別々のインスタンスを参照するのはなぜですか?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 の 2 つの別々のインスタンスを参照するのはなぜですか?

呼び出し元に依存しません: ボタンの新しいインスタンスを毎回明示的に作成しています (たとえばButtons().hbox、新しいインスタンスを作成し、そこから hbox を取得します)。

オブジェクト インスタンスを明示的に参照するにはどうすればよいですか?

すでにインスタンスを参照していますが、それは毎回新しいインスタンスです。これら 2 つの呼び出しは、予想どおり、同じインスタンスでメソッドを呼び出します。

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

これはすべてのオブジェクト指向言語で同じなので、オブジェクト指向のチュートリアルは役に立ちますが、 http://docs.python.org/tutorial/classes.htmlは Python でクラスがどのように機能するかを理解するのに役立つかもしれません。

于 2013-08-12T13:26:40.860 に答える
-1

self.button は、リスナー クラスのインスタンスで宣言されたボタン変数である 1 つの同じオブジェクトのみを参照しています。

オブジェクトの前に「self」などのキーワードを付けるのは、OOP では非常に一般的です。C#/Java のバックグラウンドを持っている場合、Visual Basic を学習したことがあれば、"this" または "Me" キーワードに注意する必要があります。Python を際立たせている点の 1 つは、次のようなメソッド定義での self キーワードの使用です。

def the_method(self, button):

最初のパラメーターとして self を追加すると、これをインスタンス メソッドとして扱うように python に指示されます。そのため、オブジェクト foo が Buttons クラスに存在する場合、このインスタンス メソッドを次のようにすぐに呼び出すことができます。

foo.the_method(xyz)

呼び出し中にここで「self」パラメーターを渡す必要はありません。インスタンスメソッドにするためだけに存在します。一方、self パラメータを省略すると、特定のインスタンスにリンクされていない静的メソッドと呼ばれるものになります。

def the_method(button):

その場合、foo インスタンスを作成せずに、次を直接呼び出すことができます。

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