Der Unterstrich _ ist eine Besonderheit in Python. Während der Unterstrich in vielen Sprachen nur für Variablen und Funktionen in Großbuchstaben verwendet wird, hat er in Python eine besondere Bedeutung. Er wird in verschiedenen Szenarien ausgiebig verwendet, unter anderem in Fällen, in denen wir einen Wert ignorieren möchten, oder in der Deklaration von Variablen, Methoden usw.

Einfache und doppelte Unterstriche haben eine Bedeutung in den Variablen- und Methodennamen von Python. Ein Teil der Bedeutung ergibt sich aus Konventionen, während ein anderer Teil vom Python-Interpreter erzwungen wird.

In diesem Artikel werden wir die fünf Unterstrichmuster und Namenskonventionen besprechen und wie sie das Verhalten unserer Python-Programme beeinflussen. Das Verständnis dieser Konzepte wird uns vor allem beim Schreiben von fortgeschrittenem Code sehr helfen.

Am Ende dieses Beitrags werden wir ein gutes Verständnis dafür haben, wie und wo wir welches Unterstrichmuster in unserer Namenskonvention verwenden. Fangen wir also an.

Einfacher führender Unterstrich: _var

Das Unterstrich-Präfix ist als Hinweis für andere Programmierer gedacht, dass eine Variable oder Methode, die mit einem einzelnen Unterstrich beginnt, für den internen Gebrauch bestimmt ist. Diese Konvention ist in PEP 8 definiert.

Ein Name, dem ein Unterstrich vorangestellt ist (z.B. _spam), sollte als nicht-öffentlicher Teil der API behandelt werden (egal ob es sich um eine Funktion, eine Methode oder ein Datenelement handelt). Es sollte als ein Implementierungsdetail betrachtet werden und kann ohne Vorankündigung geändert werden.

Schauen Sie sich das folgende Beispiel an:

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26

Lassen Sie uns die obige Klasse instanziieren und versuchen, auf die Attribute name und _age zuzugreifen.

>>> p = Person()>>> p.name
Sarah>>> p._age
26

Der einfache Unterstrich in Python ist also lediglich eine vereinbarte Konvention und schränkt den Zugriff auf den Wert dieser Variablen nicht ein.

Doppelter führender Unterstrich: __var

Die Verwendung eines doppelten Unterstrichs (__) vor einem Namen (insbesondere einem Methodennamen) ist keine Konvention; er hat eine bestimmte Bedeutung für den Interpreter.

Python verwirrt diese Namen und wird verwendet, um Namenskonflikte mit Namen zu vermeiden, die von Unterklassen definiert werden.

Dies wird auch als „name mangling“ bezeichnet – der Interpreter ändert den Namen der Variablen in einer Weise, die es schwieriger macht, Kollisionen zu erzeugen, wenn die Klasse später erweitert wird.

Zum besseren Verständnis erstellen wir unsere Spielzeugklasse zum Experimentieren:

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26
self.__id = 30

Werfen wir einen Blick auf die Attribute des Objekts mit der eingebauten Funktion dir():

>>> p = Person()
>>> dir(p)
>>> p.name
Sarah
>>> p._age
26>>> p.__id
AttributeError: 'Person' object has no attribute '__id'>>> p._Person__id
30

Aus der obigen Liste der Objektattribute können wir sehen, dass self.name und self._age unverändert erscheinen und sich genauso verhalten.

Jedoch wird __id in _Person__id umgewandelt. Dies ist die Namensumwandlung, die der Python-Interpreter vornimmt. Er tut dies, um die Variable davor zu schützen, in Unterklassen überschrieben zu werden.

Wenn wir nun eine Unterklasse von Person erstellen, sagen wir Employee, können wir die __id-Variable von Person nicht einfach überschreiben.

Das beabsichtigte Verhalten hier ist fast gleichwertig mit finalen Variablen in Java und nicht-virtuellen in C++.

Single Trailing Underscore: var_

Wie in den PEP 8-Dokumenten erklärt:

Single Trailing Underscore-Namenskonvention wird verwendet, um Konflikte mit Python-Schlüsselwörtern zu vermeiden.

Wenn der passendste Name für eine Variable bereits durch ein Schlüsselwort belegt ist, wird ein einzelner Unterstrich angehängt, um den Namenskonflikt zu lösen. Ein typisches Beispiel ist die Verwendung von class oder anderen Schlüsselwörtern als Variablen.

>>> def method(name, class='Classname'): # ❌
SyntaxError: "invalid syntax">>> def method(name, class_='Classname'): # ✅
... pass

Doppelte führende und nachgestellte Unterstriche: __var__

Namen, die führende und abschließende doppelte Unterstriche („Dunder“) haben, sind für spezielle Verwendungen reserviert, wie die__init__-Methode für Objektkonstruktoren oder die __call__-Methode, um Objekte aufrufbar zu machen. Diese Methoden sind als Dunder-Methoden bekannt.

Soweit es einen betrifft, ist dies nur eine Konvention, eine Möglichkeit für das Python-System, Namen zu verwenden, die nicht mit benutzerdefinierten Namen in Konflikt geraten. Daher sind Dunder nur eine Konvention und werden vom Python-Interpreter unberührt gelassen.

class Person:
def __init__(self):
self.__name__ = 'Sarah'>>> Person().__name__
Sarah

Die Dunder erreichen das gewünschte Ziel, bestimmte Methoden zu etwas Besonderem zu machen, während sie gleichzeitig in jeder Hinsicht, außer der Namenskonvention, mit anderen einfachen Methoden identisch sind.

Um ehrlich zu sein, hält uns nichts davon ab, unsere eigenen Dundernamen zu schreiben, aber es ist am besten, sie nicht in unseren Programmen zu verwenden, um Kollisionen mit zukünftigen Änderungen der Python-Sprache zu vermeiden. (Siehe meinen Artikel, in dem die Dunder ausführlich beschrieben werden).

Einfacher Unterstrich: _

Nach Konvention wird ein einzelner Unterstrich manchmal als Name verwendet, um anzuzeigen, dass eine Variable temporär oder unbedeutend ist.

In der folgenden Schleife brauchen wir beispielsweise keinen Zugriff auf den laufenden Index und können „_“ verwenden, um anzuzeigen, dass es sich nur um einen temporären Wert handelt:

>>> for _ in range(10):
... print('Welcome Sarah!!')

Auch diese Bedeutung ist nur „nach Konvention“ und es gibt kein spezielles Verhalten, das im Python-Interpreter ausgelöst wird. Der einzelne Unterstrich ist einfach ein gültiger Variablenname, der manchmal für diesen Zweck verwendet wird.

Schlussfolgerungen:

Die Kenntnis der verschiedenen Unterstrichmuster wird uns helfen, unseren Code pythonischer zu schreiben. 😄

Hier ist eine kurze Zusammenfassung unserer 5 Unterstrichmuster für Namenskonventionen, die wir oben behandelt haben.

  • Einfacher führender Unterstrich _var: Namenskonvention, die angibt, dass der Name für den internen Gebrauch gedacht ist. Ein Hinweis für Programmierer und nicht von Programmierern erzwungen.
  • Doppelt führender Unterstrich __var: Löst Namensverwechslung aus, wenn im Klassenkontext verwendet. Wird vom Python-Interpreter erzwungen.
  • Einfacher Unterstrich am Ende var_: Wird per Konvention verwendet, um Namenskonflikte mit Python-Schlüsselwörtern zu vermeiden.
  • Double Trailing Underscore __var__: Kennzeichnet spezielle Methoden, die von der Python-Sprache definiert werden.
  • Underscore _: Wird als Name für temporäre Variablen verwendet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.