__var in Python?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Diese Benennungsform nutzt man bei Attributen innerhalb von Klassen, wenn man verhindern möchte, dass Subklassen das entsprechende Attribut kennen bzw. überschreiben können.

Wenn der Name eines Attributs mit mehr als einem Unterstrich beginnt und weniger als einem Unterstrich aufhört (als Abgrenzung zu magic attributes), dann wird er nachträglich (implizit) von Python manipuliert (Fachjargon: name mangling), indem noch der Klassenname eingebaut wird.

So wird bei dieser Klasse Test:

class Test:
  def __init__(self):
    self.__value = 123

Das Attribut __value intern zu _Test__value umbenannt. Das kannst du konkret auch einmal nachprüfen, in dem du dir einfach alle Attribute eines Testobjekts ausgeben lässt:

print(dir(Test()))

Dieses zweite Beispiel zeigt die konkrete Wirkung:

class Base:
  def __init__(self):
    self.__value = 1
    self.value = 2

  def print_values(self):
    print(self.__value)
    print(self.value)

class Sub(Base):
  def __init__(self):
    Base.__init__(self)
    self.__value = 3
    self.value = 4

s = Sub()
s.print_values()

Es gibt zwei Klassen, wobei die zweite Klasse von der ersten erbt.

Bei Aufruf von print_values wird für value der Wert 4 ausgegeben, da in der Subklasse eine Überschreibung stattfindet. Für __value bekommst du allerdings die 1, denn innerhalb von Base wird der Variablenname intern in _Base__value aufgelöst.