Python-Attribute: Wie sie funktionieren 🐍

Attribute sind das Fundament des objektorientierten Modells von Python, aber die meisten Anfänger (und sogar viele Fortgeschrittene) nutzen sie intuitiv, ohne zu verstehen, was "unter der Haube" passiert. Die Folge: unvorhersehbares Code-Verhalten, Speicherfresser und Spaghetti-API.

Lassen Sie uns die Nuancen durchgehen 👇

1️⃣ Suchreihenfolge (MRO)
Python lebt nach dem Prinzip: zuerst das Objekt, dann die Klasse.

Wenn Sie auf obj.attr zugreifen, schaut der Interpreter zuerst in obj.__dict__. Wenn er nichts findet, geht er zu Class.__dict__.
Wenn Sie versehentlich etwas in obj.attr schreiben, erstellen Sie ein Instanzattribut, das das Klassenattribut verdeckt.

class Hero:
weapon = "Sword"

h = Hero()
h.weapon = "Gun" # Jetzt hat h seine eigene Waffe, die Klasse hat immer noch das Schwert

Das ist kein Bug, sondern ein Feature, aber behalten Sie es im Auge. Wenn Sie das Attribut für alle ändern möchten, greifen Sie auf die Klasse zu.

2️⃣ __dict__ vs __slots__
Standardmäßig hat jedes Objekt ein __dict__ – eine Hash-Tabelle (Dictionary), in der die Attribute gespeichert werden. Das ist flexibel, aber speicherintensiv.

Wenn Sie Millionen von Objekten desselben Typs erstellen, verwenden Sie __slots__.
🔵Was das bringt: Wir verhindern die Erstellung von __dict__ für die Instanz, indem wir den Satz von Attributen fest im Speicher fixieren (wie ein Array).
🔵Vorteil: 25-30% weniger Speicherverbrauch und etwas schnellerer Zugriff.
🔵Preis: Sie verlieren die dynamische Möglichkeit, neue Attribute spontan hinzuzufügen.

3️⃣ Die Illusion der Kapselung
In Python gibt es keine "privaten" Felder. Gar nicht.
Konstrukte wie __attribute sind kein Datenschutz, sondern Name Mangling (Namensverzerrung). Python benennt die Variable einfach in _ClassName__attribute um, um ein versehentliches Überschreiben in Unterklassen zu vermeiden.
Wenn Sie __ in der Hoffnung schreiben, dass niemand an Ihre Daten kommt, dann sieht jeder, der dir() verwenden kann, alles. Schreiben Sie _private (ein Unterstrich) – bedeutet "nicht anfassen, das ist eine interne API". Das ist eine Frage der Kultur, nicht des Compilers.

Möchten Sie Daten verstecken? Verwenden Sie einen einzelnen Unterstrich _ nur als Signal an Kollegen: "Fass das nicht an, das ist interne Küche".

4️⃣ @property: Der ethische Getter
Machen Sie in Python niemals Java-artige Getter (get_value(), set_value()). Wenn Sie beim Zugriff auf ein Attribut Logik benötigen, verwenden Sie @property.
@property ermöglicht es, eine Methode in ein Attribut zu verwandeln. Sie behalten eine saubere API (Zugriff über Punkt), können aber unter der Haube Daten validieren, Zugriffe protokollieren oder Werte spontan berechnen.
class DataStorage:
def __init__(self, value):
self._value = value

@property
def value(self):
return self._value

@value.setter
def value(self, new_val):
if not isinstance(new_val, int):
raise ValueError("Nur int, Baby"))
self._value = new_val


So behalten Sie eine saubere Schnittstelle: obj.value = 10 sieht genauso einfach aus wie die Arbeit mit einem normalen Feld, aber Sie kontrollieren, was genau dort geschrieben wird.

Welche anderen "magischen" Stellen in Python werfen bei Ihnen Fragen auf? Schreiben Sie sie in die Kommentare, wir schauen sie uns an. 👇

#anatomie_des_pythons