Frage

Ich habe Klassen benutzen nur für eine kurze Weile, und wenn ich eine Methode schreiben, ich mache alle Variablen selbst verweisen, z.B. self.foo.

Aber ich bin auf der Suche durch die WxPython in Aktion Buch und feststellen, dass „selbst“ nicht die ganze Zeit verwendet wird. Zum Beispiel:

 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)

Das unter Nutzt "Selbst".

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")

Wenn ich es richtig, „selbst“ erinnern ist, Bezug auf eine bestimmte Instanz der Klasse, so dass, wenn es nicht notwendig ist? Gibt es eine Faustregel?

War es hilfreich?

Lösung

Sie verwenden self.attribute ein Attribut der aktuellen Instanz zu verweisen.

Sie verwenden wx.Frame.__init__() eine Methode der Elternklasse zu verweisen.

Sie verwenden nicht self, wenn Sie nur einen lokalen Namen (Variable) des Verfahrens (Funktion) verweisen Sie sind in.

Dies sind keine „Faustregeln“, weil es keine Ausnahmen geben.


Was wahrscheinlich ist man in diesem speziellen Beispiel verwirrend ist, dass Panel nur ein lokaler Name im Konstruktor zu sein scheint, so sieht es aus wie das Panel, sobald Ihr Konstruktor kehrt verschwinden würde.

Wenn Sie auf die Dokumentation aussehen wx.Panel, aber Sie werden sehen, dass seine Konstruktor der Platte an das übergeordnete Fenster befestigt, so dass es existieren weiterhin, auch nach den Konstruktor zurückkehrt.

Magic:)

Andere Tipps

In den Fällen, wenn Sie self nicht dann verwenden, werden Sie erstellen nur eine lokale Variable dieses Namens. Im ersten Beispiel panel wird als lokaler Variable erstellt und dann später in der Funktion verwiesen wird, aber es wird nicht außerhalb dieser Funktion zur Verfügung steht. Der Akt self zum wx.Panel Konstruktor übergeben Sie mit dem aktuellen Objekt in irgendeiner Weise verbunden ist, so dass es nicht einfach verschwinden, wenn die Funktion zurück.

Selbst immer erforderlich, wenn zum Beispiel selbst Bezug genommen wird, mit Ausnahme beim Aufruf des Basisklassenkonstruktor (wx.Frame .__ init__). Alle anderen Variablen, die Sie in den Beispielen sehen (Panel, basicLabel, basicText, ...) sind nur lokale Variablen - nicht auf das aktuelle Objekt im Zusammenhang überhaupt. Diese Namen werden verschwunden sein, wenn die Methode gibt -. Alles in self.foo setzen wird das Ende des Verfahrens überleben, und in der nächsten Methode (z self.button) verfügbar sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top