web-dev-qa-db-ger.com

Warum haben einige Funktionen vor und nach dem Funktionsnamen "__"?

Dies scheint viel zu geschehen und fragte sich, ob dies eine Anforderung in der Python-Sprache war oder nur eine Frage der Konvention?

Könnte jemand auch benennen und erklären, welche Funktionen tendenziell Unterstriche haben und warum (zum Beispiel __init__)?

353
Chuck Testa

Aus dem Python PEP 8 - Style Guide für Python Code :

Beschreibend: Benennen von Stilen

Folgende Sonderformen mit führenden oder nachgestellten Unterstrichen werden erkannt (diese können grundsätzlich mit beliebigen Konventionen kombiniert werden):

  • _single_leading_underscore: schwacher Indikator für "internen Gebrauch". Z.B. from M import * importiert keine Objekte, deren Name mit einem Unterstrich beginnt.

  • single_trailing_underscore_: Wird nach Konvention verwendet, um Konflikte mit dem Schlüsselwort Python zu vermeiden, z.

    Tkinter.Toplevel(master, class_='ClassName')

  • __double_leading_underscore: Ruft beim Benennen eines Klassenattributs die Namensverknüpfung auf (in der Klasse FooBar wird __boo zu _FooBar__boo; siehe unten).

  • __double_leading_and_trailing_underscore__: "magische" Objekte oder Attribute, die in benutzergesteuerten Namespaces leben. Z.B. __init__, __import__ oder __file__. Erfinde niemals solche Namen; Verwenden Sie sie nur wie dokumentiert.

Beachten Sie, dass Namen mit doppelten führenden und nachfolgenden Unterstrichen im Wesentlichen für Python selbst reserviert sind: "Erfinde niemals solche Namen, sondern verwende sie nur wie dokumentiert".

486
Michael Burr

Die anderen Befragten beschreiben die doppelten führenden und nachgestellten Unterstriche als Namenskonvention für "spezielle" oder "magische" Methoden.

Während Sie diese Methoden direkt aufrufen können (z. B. [10, 20].__len__()), ist das Vorhandensein von Unterstrichen ein Hinweis darauf, dass diese Methoden indirekt aufgerufen werden sollen (z. B. len([10, 20])). Den meisten Python-Operatoren ist eine "magische" Methode zugeordnet (zum Beispiel ist a[x] die übliche Art, a.__getitem__(x) aufzurufen).

49

Namen, die von doppelten Unterstrichen umgeben sind, sind für Python "besonders". Sie sind in der Python-Referenzhandbuch, Abschnitt 3, "Datenmodell" aufgeführt.

Eigentlich verwende ich _ Methodennamen, wenn ich mich zwischen übergeordneten und untergeordneten Klassennamen unterscheiden muss. Ich habe einige Codes gelesen, mit denen Eltern-Kind-Klassen erstellt wurden. Als Beispiel kann ich diesen Code angeben: 

class ThreadableMixin:
   def start_worker(self):
       threading.Thread(target=self.worker).start()

   def worker(self):
      try:
        self._worker()
    except tornado.web.HTTPError, e:
        self.set_status(e.status_code)
    except:
        logging.error("_worker problem", exc_info=True)
        self.set_status(500)
    tornado.ioloop.IOLoop.instance().add_callback(self.async_callback(self.results))

...

und das Kind, das eine _worker-Methode hat 

class Handler(tornado.web.RequestHandler, ThreadableMixin):
   def _worker(self):
      self.res = self.render_string("template.html",
        title = _("Title"),
        data = self.application.db.query("select ... where object_id=%s", self.object_id)
    )

...

5
Omadbek Onorov

Diese Konvention wird für spezielle Variablen oder Methoden (so genannte "magische Methode") wie _init__, len verwendet. Diese Methoden stellen spezielle syntaktische Funktionen bereit oder führen spezielle Aufgaben aus. 

Beispielsweise gibt file den Speicherort der Python-Datei an, eq wird ausgeführt, wenn ein Ausdruck == b ausgeführt wird. 

Ein Benutzer kann natürlich eine spezielle Methode erstellen, dies ist sehr selten, kann jedoch die integrierten Methoden ändern. (Sie sollten beispielsweise die Klasse mit init initialisieren, die zuerst ausgeführt wird, wenn eine Klasseninstanz erstellt wird.)

   class A:
      def __init__(self, a): # use special method '__init__' for initializing
        self.a = a
      def __custom__(self): # custom special method. you might almost do not use it
        pass
0
Shagun Pruthi

Hinterer doppelter Unterstrich (Name Mangling)/Aus den Python-Dokumenten

Jeder Bezeichner der Form __spam (mindestens zwei führende Unterstriche, höchstens ein nachfolgender Unterstrich) wird textuell durch _klassenname__spam ersetzt, wobei klassenname der aktuelle Klassenname ist, bei dem der führende Unterstrich entfernt ist. Diese Zerlegung erfolgt unabhängig von der syntaktischen Position des Bezeichners. Sie kann daher zum Definieren von klassenprivaten Instanz- und Klassenvariablen, Methoden, Variablen, die in globalen Variablen gespeichert sind, und sogar Variablen, die in Instanzen gespeichert sind, verwendet werden. Privat für diese Klasse bei Instanzen anderer Klassen.

Die Namensverknüpfung soll Klassen eine einfache Möglichkeit bieten, „private“ Instanzvariablen und -methoden zu definieren, ohne sich um Instanzvariablen kümmern zu müssen, die von abgeleiteten Klassen definiert wurden, oder mit Instanzvariablen durch Code außerhalb der Klasse herumspielen zu müssen. Beachten Sie, dass die Mangling-Regeln hauptsächlich dazu dienen, Unfälle zu vermeiden. Es ist einer entschlossenen Seele immer noch möglich, auf eine Variable zuzugreifen oder diese zu ändern, die als privat angesehen wird.

0
Arefe