20% off with code ERSTIS26
5 min read 14 Aug 2026

Python Sichtbarkeit private: _ und __ Konventionen einfach erklärt

_ und __ in Python sind reine Konventionen für die Sichtbarkeit. Dieser Guide erklärt den Unterschied für IT-Azubis, Studenten & Berufseinsteiger.

Marcel Schmidtpeter By Marcel Schmidtpeter 14 Aug 2026
Python Sichtbarkeit private: _ und __ Konventionen einfach erklärt

Stell dir vor, du entwickelst ein Python-Modul für eine Bibliotheksverwaltung. Du hast eine Klasse `Buch`, die einen internen Zähler für ausgeliehene Exemplare führt. Jetzt willst du verhindern, dass andere Entwickler diesen Zähler von außen direkt verändern - denn das könnte den ganzen Bestand durcheinanderbringen. Genau hier kommt das Thema Python Sichtbarkeit private ins Spiel.

Ob du als Fachinformatiker-Azubi deine erste Klasse schreibst, im Studium eine Hausarbeit programmierst oder im ersten Job an einem größeren Projekt arbeitest - früher oder später stellst du dieselbe Frage: Wie halte ich bestimmte Attribute und Methoden vor dem direkten Zugriff von außen fern? Im Gegensatz zu Java oder C# gibt es in Python kein echtes `private`-Keyword. Stattdessen arbeitet Python mit Namenskonventionen und einem Mechanismus namens Name Mangling (zu Deutsch: "Namensverstümmelung"). Dieser Beitrag zeigt dir, wie das konkret funktioniert.

Was bedeutet Sichtbarkeit in Python?

Sichtbarkeit beschreibt, von wo aus du auf ein Attribut oder eine Methode einer Klasse zugreifen kannst. In der objektorientierten Programmierung unterscheidet man grob zwischen öffentlich (public), geschützt (protected) und privat (private).

Öffentliche Elemente dürfen von überall genutzt werden. Geschützte Elemente sind nur für die Klasse selbst und ihre Subklassen gedacht. Private Elemente sind nur innerhalb der definierenden Klasse verfügbar.

In Java oder C# erzwingt der Compiler diese Regeln strikt. Python funktioniert anders - es verlässt sich auf Konventionen der Entwicklercommunity. Das offizielle Python-Tutorial drückt es so aus: *"Private" instance variables that cannot be accessed except from inside an object don't exist in Python.*

Das klingt erst einmal chaotisch. Tatsächlich ist es aber ein durchdachter Ansatz, der dir als Entwickler mehr Verantwortung gibt und gleichzeitig Flexibilität beim Testen und Erweitern von Code ermöglicht.

Merke: Python hat kein echtes `private`-Keyword. Es nutzt stattdessen Unterstrich-Konventionen (`_` und `__`) sowie den Mechanismus des Name Mangling.

Python Sichtbarkeit private: Der Unterschied zwischen _ und __

Python nutzt Unterstriche, um Sichtbarkeit zu signalisieren. Ein einzelner führender Unterstrich (`_`) markiert ein Attribut als "intern". Ein doppelter führender Unterstrich (`__`) aktiviert Name Mangling und erschwert den Zugriff zusätzlich.

Konvention

Bedeutung

Zugriff von außen

Name Mangling?

`name`

Öffentlich (public)

Ja

Nein

`_name`

Intern (protected-Konvention)

Möglich, aber unerwünscht

Nein

`__name`

Privat (Name Mangling aktiv)

Nur über umgeformten Namen

Ja

`__name__`

Dunder-Methode (Spezialmethode)

Ja, ausdrücklich erwünscht

Nein

Merke: Ein Unterstrich ist eine bitte, ein doppelter Unterstrich ist ein Mechanismus.

Die `_`-Konvention: Ein sanfter Hinweis

Ein führender Unterstrich (`_`) bei einem Attribut oder einer Methode signalisiert anderen Entwicklern: *Das ist ein internes Detail, bitte nicht von außen verwenden.* Python blockiert den Zugriff technisch nicht. Es ist reine Konvention, vergleichbar mit einem "Privat"-Schild an einer Bürotür - technisch lässt sie sich trotzdem öffnen.

Warum nutzt man das? Weil du anderen Entwicklern (und deinem zukünftigen Ich) zeigen willst, dass dieser Teil der internen Implementierung dient und sich jederzeit ändern kann. Werkzeuge wie Linter warnen dich, wenn du von außen auf ein `_`-Attribut zugreifst.

Hier ein einfaches Beispiel:

python
class Bankkonto:
    def __init__(self, inhaber, kontostand):
        self.inhaber = inhaber
        self._kontostand = kontostand  # Intern: Bitte nicht direkt aendern

    def geld_abheben(self, betrag):
        if betrag <= self._kontostand:
            self._kontostand -= betrag
            return True
        return False

    def kontostand_anzeigen(self):
        return self._kontostand

Du kannst theoretisch direkt auf `konto._kontostand` zugreifen und ihn verändern. Python hindert dich nicht daran. Aber es gilt als unsauberer Stil und wird von Code-Reviews oft moniert.

Wenn du mehr über Klassenstrukturierung lernen willst, lies unseren Beitrag zu OOP Prinzipien Python: Die 4 Grundprinzipien einfach erklärt.

Die `__`-Konvention: Wie funktioniert Name Mangling?

Zwei führende Unterstriche (`__`) aktivieren den Name Mangling-Mechanismus. Python benennt das Attribut intern um, indem es den Klassennamen voranstellt. Aus `__geheim` wird dann `_Klassenname__geheim`. Das verhindert versehentliche Namenskonflikte bei Vererbung und erschwert den direkten Zugriff.

Stell dir vor, du hast eine Klasse mit einer geheimen Methode:

python
class Fahrzeug:
    def __init__(self):
        self.__seriennummer = "SN123456"  # Name Mangling aktiv

    def __diagnose(self):
        return "Interner Diagnosetest"


auto = Fahrzeug()
# print(auto.__seriennummer)  # Fehler: AttributeError
# auto.__diagnose()           # Fehler: AttributeError

# Zugriff nur ueber den gemangelten Namen moeglich:
print(auto._Fahrzeug__seriennummer)  # Funktioniert, ist aber unsauber

Das Attribut `__seriennummer` wurde zu `_Fahrzeug__seriennummer` umbenannt. Wer den umgeformten Namen kennt, kommt trotzdem ran. Deshalb spricht man bei Python Sichtbarkeit private immer nur von "privat" in Anführungszeichen.

Interessant wird es bei Vererbung: Wenn eine Kindklasse ein gleichnamiges `__`-Attribut definiert, überschreibt sie nicht das Attribut der Elternklasse. Beide existieren nebeneinander - genau dafür wurde Name Mangling erfunden.

python
class Basis:
    def __init__(self):
        self.__wert = 10  # Wird zu _Basis__wert

    def zeige_wert(self):
        return self.__wert


class Kind(Basis):
    def __init__(self):
        super().__init__()
        self.__wert = 20  # Wird zu _Kind__wert, ueberschreibt nicht!


kind = Kind()
print(kind.zeige_wert())  # Ausgabe: 10 (nicht 20!)

Mehr zu Vererbung findest du in unserem Artikel Python super() verstehen: Vererbung richtig nutzen.

Merke: Name Mangling schützt nicht vor absichtlichem Missbrauch, sondern verhindert versehentliche Kollisionen in Vererbungshierarchien.

Wann nutzt man `_` und wann `__`?

Die Faustregel ist einfach: Nutze `_` für interne Implementierungsdetails, die Subklassen theoretisch sehen dürfen. Nutze `__`, wenn du Namenskonflikte bei Vererbung vermeiden willst oder wirklich signalisieren möchtest, dass etwas komplett intern ist.

Die meisten Python-Entwickler verwenden fast ausschließlich `_`. Doppelte Unterstriche brauchst du nur selten - meist bei Bibliotheken mit komplexen Klassenhierarchien. Die offizielle PEP 8 empfiehlt `_` für nicht-öffentliche Methoden und Instanzvariablen.

Praxisbeispiel: Eine `TemperaturSensor`-Klasse

Hier siehst du beide Konventionen im Einsatz. Der Sensor speichert Rohwerte intern und bietet eine bereinigte öffentliche Schnittstelle:

python
class TemperaturSensor:
    def __init__(self):
        self._rohwert = 0.0  # Intern, fuer Kalibrierung zugaenglich
        self.__offset = 2.5  # Wirklich privat, Namenskollision vermeiden

    def set_rohwert(self, wert):
        """Setzt den gemessenen Rohwert."""
        self._rohwert = wert

    def lese_temperatur(self):
        """Gibt die korrigierte Temperatur zurueck."""
        return self._rohwert + self.__offset

    def __kalibriere_intern(self):
        """Interne Kalibrierung, nicht fuer oeffentliche Nutzung."""
        self.__offset = 2.5  # Reset auf Werkseinstellung


# Nutzung
sensor = TemperaturSensor()
sensor.set_rohwert(20.0)
print(sensor.lese_temperatur())  # Ausgabe: 22.5

# sensor.__kalibriere_intern()  # AttributeError: Nicht direkt aufrufbar
# sensor.__offset = 5.0         # Wuerde neues Attribut erzeugen!

Beachte die letzte Zeile: Wenn du `sensor.__offset = 5.0` schreibst, meckert Python nicht. Es erstellt einfach ein neues Attribut mit dem Namen `__offset` - das ursprüngliche `_TemperaturSensor__offset` bleibt unberührt. Das ist eine typische Falle für Python-Einsteiger.

Welche Fehler passieren häufig bei Python Sichtbarkeit private?

Fehler 1: `_` als echtes Private verstehen

Viele Einsteiger denken, `_variablen` seien unzugänglich wie in Java oder C#. Das stimmt nicht. Der Unterstrich ist nur eine Konvention ohne technische Durchsetzung. Wenn du echte Kapselung brauchst, wirst du in Python enttäuscht. Stattdessen musst du diszipliniert bleiben und die Konvention respektieren.

Fehler 2: `__` versehentlich überschreiben

python
class Beispiel:
    def __init__(self):
        self.__zahl = 42


b = Beispiel()
b.__zahl = 99  # KEIN Fehler! Erzeugt neues Attribut
print(b._Beispiel__zahl)  # Ausgabe: 42 (unveraendert)
print(b.__zahl)  # Ausgabe: 99 (neues Attribut)

Das ist verwirrend: Du glaubst, du hättest den Wert geändert. Tatsächlich hast du ein neues Attribut hinzugefügt. Der Originalwert bleibt unangetastet. Warum? Weil Name Mangling nur beim Definieren innerhalb der Klasse greift, nicht bei externen Zuweisungen.

Fehler 3: Dunder-Methoden verwechseln

Methoden wie `__init__`, `__str__` oder `__len__` haben zwei Unterstriche vorne und hinten. Diese sogenannten Dunder-Methoden (von "double underscore") sind Spezialmethoden von Python und völlig öffentlich. Verwechsle sie nicht mit privaten Attributen.

Details dazu in unserem Beitrag Python Dunder Methoden: `__str__`, `__eq__` & `__hash__` einfach erklärt.

Übungstipp: Sichtbarkeit selbst ausprobieren

Nimm die `TemperaturSensor`-Klasse von oben und erweitere sie:

  1. Füge ein weiteres `__`-Attribut für die Seriennummer hinzu.

  2. Erstelle eine Subklasse `PraezisionsSensor`, die einen eigenen `__offset` definiert.

  3. Prüfe mit `vars(objekt)`, welche Attribute tatsächlich existieren.

Der Befehl `vars()` zeigt dir das interne `__dict__` eines Objekts. Damit siehst du sofort, wie Name Mangling die Attribute umbenennt. Das ist extrem hilfreich beim Debuggen.

FAQ: Häufige Fragen

Kann ich in Python echte private Attribute erzwingen?

Nein, nicht nativ. Die Philosophie von Python lautet: *"We are all consenting adults here."* Du kannst Attribute immer irgendwie erreichen. Wenn du kontrollierte Kapselung brauchst, schreibe stattdessen saubere Getter- und Setter-Methoden oder nutze den `@property`-Dekorator.

Was ist der Unterschied zwischen `_name` und `__name`?

`_name` ist eine reine Konvention ("bitte nicht verwenden"). `__name` aktiviert Name Mangling und wird intern zu `_Klassenname__name` umbenannt. Letzteres erschwert den direkten Zugriff und verhindert Namenskonflikte bei Vererbung.

Wann sollte ich `__` statt `_` verwenden?

Eher selten. Nutze `__` nur, wenn du in einer tiefen Vererbungshierarchie arbeitest und Namenskonflikte mit Subklassen befürchtest. In 90 % der Fälle reicht ein einfacher Unterstrich völlig aus.

Warum verwendet Python kein `private`-Keyword?

Python setzt auf Konvention statt Restriktion. Das macht die Sprache flexibler und vertraut den Entwicklerinnen und Entwicklern. Außerdem lässt sich so Code leichter testen und anpassen, weil interne Details erreichbar bleiben.

Wie funktioniert `@property` als Alternative?

Mit dem `@property`-Dekorator definierst du kontrollierte Zugriffsmethoden. Du kannst Lesen und Schreiben trennen, Validierung einbauen und trotzdem eine saubere Syntax bieten. Das ist der empfohlene Weg für kontrollierte Kapselung in Python. Mehr dazu in der offiziellen Python-Dokumentation zu `@property`.

Fazit

Python löst das Thema Sichtbarkeit private pragmatisch. Ein führender Unterstrich signalisiert: "Bitte nicht anfassen." Zwei führende Unterstriche aktivieren Name Mangling und erschweren versehentliche Zugriffe sowie Namenskonflikte bei Vererbung. Echte Privatsphäre wie in Java gibt es nicht - und das ist auch gewollt.

Die wichtigste Regel für die Praxis: Verwende `_` als Standard für interne Details, `__` nur bei echten Vererbungsproblemen und Dunder-Methoden (`__name__`) ausschließlich für Python-Spezialmethoden.

Wenn du bei OOP-Konzepten, Python Sichtbarkeit private oder anderen IT-Themen Unterstützung brauchst - ob für die IHK-Abschlussprüfung, die Uni-Klausur oder den Berufseinstieg - schau dir die Nachhilfeangebote von study-it.education an. Dort helfen dir erfahrene Tutoren, komplexe IT-Themen einfach zu verstehen und in der Praxis anzuwenden.


First chat · €0 · 30 min

Need someone to walk through this with you?

Instead of re-reading: 30 min with a senior dev.

Book a free first chat →
About the author
Marcel Schmidtpeter
Marcel Schmidtpeter

_ und __ in Python sind reine Konventionen für die Sichtbarkeit. Dieser Guide erklärt den Unterschied für IT-Azubis, Studenten & Berufseinsteiger.

marcel.schmidtpeter@study-it.education →
Keep reading

More reading