13

私はクラスをほんの少ししか使用していませんが、メソッドを作成するときは、すべての変数が self.foo のように self を参照するようにしています。

しかし、wxPython in Action book を調べていると、「self」が常に使用されているわけではないことに気付きました。例えば:

 import wx
 class TextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Text Entry Example',
            size=(300, 100))
        panel = wx.Panel(self, -1)
        basicLabel = wx.StaticText(panel, -1, "Basic Control:")
        basicText = wx.TextCtrl(panel, -1, "I've entered some text!",
            size=(175, -1))
        basicText.SetInsertionPoint(0)
        pwdLabel = wx.StaticText(panel, -1, "Password:")
        pwdText = wx.TextCtrl(panel, -1, "password", size=(175, -1),
            style=wx.TE_PASSWORD)
        sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)
        sizer.AddMany([basicLabel, basicText, pwdLabel, pwdText])
        panel.SetSizer(sizer)

以下は「self」を使用しています。

import wx
class ButtonFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Button Example',
            size=(300, 100))
        panel = wx.Panel(self, -1)
        self.button = wx.Button(panel, -1, "Hello", pos=(50, 20))
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)
        self.button.SetDefault()
    def OnClick(self, event):
        self.button.SetLabel("Clicked")

私の記憶が正しければ、「自己」はクラスの特定のインスタンスへの参照です。一般的な経験則はありますか?

4

3 に答える 3

9

self.attribute現在のインスタンスの属性を参照するために使用します。

wx.Frame.__init__()親クラスのメソッドを参照するために使用します。

self使用しているメソッド (関数) のローカル名 (変数) のみを参照する場合は使用しません。

例外がないため、これらは「経験則」ではありません。


この特定の例でおそらく混乱しているのは、パネルがコンストラクター内のローカル名にすぎないように見えるため、コンストラクターが戻るとパネルが消えるように見えることです。

wx.Panelただし、のドキュメントを見ると、そのコンストラクターがパネルを親ウィンドウにアタッチしているため、コンストラクターが戻った後でもパネルが存在し続けることがわかります。

魔法 :)

于 2008-11-11T10:42:20.440 に答える
4

そのような場合、使用しない場合はself、その名前のローカル変数のみを作成します。最初の例でpanelは、 はローカル変数として作成され、後で関数内で参照されますが、その関数の外では使用できません。wx.Panel コンストラクターに渡す行為はself、何らかの方法でそれを現在のオブジェクトに関連付けたので、関数が戻ったときに消えるだけではありません。

于 2008-11-11T08:26:41.633 に答える
0

インスタンス自体を参照するときは常にself が必要ですが、基本クラスのコンストラクタ (wx.Frame.__init__) を呼び出す場合は除きます。例にある他のすべての変数 (panel、basicLabel、basicText など) は単なるローカル変数であり、現在のオブジェクトにはまったく関係ありません。これらの名前は、メソッドが戻るとなくなります。self.foo に入れられたものはすべて、メソッドの終了後も残り、次のメソッド (たとえば、self.button) で使用できます。

于 2008-11-11T08:27:44.610 に答える