Also so bekommst Du wenigstens die "Antwort":
Code: Alles auswählen
class Outer():
def __init__(self):
self.var = 21
class Inner():
val = self.var
out = val * 2
out = Inner()
print str(out.out) + ' ist die Antwort!'
Aber das ist sicher alles nicht das was Du willst. Was willst Du überhaupt!?
Innere Klassen braucht man nur sehr selten, wenn überhaupt und *so* tief innen drin schon gar nicht. Deine Klasse ist in der Methode, dass heisst die ``class``-Anweisung, denn das ist es, eine *ausführbare Anweisung* wird bei jedem Aufruf der Methode ausgeführt. Das heisst bei jedem Aufruf wird eine *neue* Klasse erzeugt. Wenn Du die Methode nie aufrufst, gibt es gar keine `Inner`-Klasse, wenn Du sie x-mal aufrufst, werden x verschiedene `Inner`-Klassen erstellt.
Gehen wir mal Deinen Code durch: In Zeile 4 wird 21 an das Attribut `var` der `Outer`-Instanz gebunden. Dann wird die ``class``-Anweisung ausgeführt bei der eine neue Klasse erzeugt wird, die auf den lokalen Namen `Inner` hört. Auf *Klassenebene* willst Du jetzt an das Klassenattribut `Inner.val` das Objekt von `self.var` binden (`self` ist immer noch die `Outer`-Instanz in deren `__init__()` wir uns gerade befinden).
Zeile 8 bindet dann "die Antwort"
an die `Outer`-Instanz, nicht an die `Inner`-Klasse.
Dann erzeugst Du eine `Inner`-Instanz und versuchst in Zeile 11 auf das nicht vorhandene Attribut `out` auf dieser Instanz zuzugreifen.