Namensräume in Python (name spaces)         (C) 2017-2021 T.Birnthaler OSTC GmbH
===================================

Folgende Namensräume (name spaces) gibt es in Python:

+----------------+-------------------------------------------------------------+
| Namensraum     | Bedeutung                                                   |
+----------------+-------------------------------------------------------------+
| Built-in       | In Python-Interpreter direkt eingebaut (z.B. len, sum, ...) |
|                | Zugriff per NAME oder builtins.NAME (nach import builtins)  |
| Global         | Im Skript außerhalb von Funktion, Klasse, Objekt            |
|                | Zugriff per NAME oder __main__.NAME (nach import __main__)  |
| Funktionslokal | In FUNKTION definiert per NAME = WERT oder Funk.-Parameter  |
|                | Zugriff per NAME (geht beim Verlassen der Funktion verloren)|
| Klassenlokal   | In KLASSE außerhalb METHODE definiert per NAME = WERT       |
|                | Zugriff per KLASSE.NAME (von innen und aussen)              |
| Objektlokal    | In KLASSEN-METHODE definiert per self.NAME = WERT           |
|                | Zugriff innerhalb Klassendefinitiion per self.NAME          |
|                | Zugriff außerhalb Klassendefinitiion per OBJEKT.NAME        |
|                | (geerbt von Klasse, Oberklasse, ... falls in Obj. nicht def)|
| Modullokal     | Zugriff außerhalb von MODUL per MODUL.NAME = WERT           |
|                | (innerhalb von MODUL analog globale Variable)               |
+----------------+-------------------------------------------------------------+
| Modulattribut  | Zugriff per MODUL.NAME                                      |
| Klassenattrib. | Zugriff per KLASSE.NAME                                     |
| Objektattribut | Zugriff per OBJEKT.NAME                                     |
| Funktionsattr. | Zugriff per FUNKTION.NAME                                   |
+----------------+-------------------------------------------------------------+

Das Modul "__main__" bietet einen 2. Zugriffsweg auf GLOBALE Namen des
Hauptmoduls (Konstanten, Variablen, Funktionen, Klassen, Module):

  gv = "global"            # Globale Variable gv erzeugen
  print(gv)                # Globale Variable gv ausgeben (lesen)
  import __main__          # Namensraum von Hauptmodul importieren
  print(gv)                # Globale Variable gv ausgeben (lesen)
  print(__main__.gv)       # Globale Variable gv ausgeben (lesen)
  def f():                 # Funktion f() definieren
      gv = "lokal"         # Lokale Variable gv erzeugen
      print(gv)            # Lokale Variable gv ausgeben (lesen)
      print(__main__.gv)   # Globale Variable gv ausgeben (lesen)
      __main__.gv = "fff"  # Globale Variable gv schreiben
  f()                      # Funktion f() aufrufen
  print(gv)                # Globale Variable gv ausgeben (lesen)
  print(__main__.gv)       # Globale Variable gv ausgeben (lesen)

Das Modul "builtins" bietet einen 2. Zugriffsweg auf den vordefinierten
"Built-in" Namensraum (Konstanten, Variablen, Funktionen, Klassen, Module):

  len("hallo")             # Eingebaute Funktion len() aufrufen
  len = "hallo"            # Als Wert einen String zuweisen
  print(len)               # --> eingebaute Funktion nicht mehr erreichbar
  import builtins          # "Built-in" Namensraum importieren
  builtins.len("hallo")    # Eingebaute Funktion len() aufrufen
  print(len)               # Stringwert ausgeben