Reihenfolge von Klassen bei Vererbung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mak112358
User
Beiträge: 1
Registriert: Freitag 16. April 2021, 12:50

Freitag 16. April 2021, 13:01

Hallo,

Ich google mir schon einen Ast ab und finde einfach nicht das richtige Schlagwort zur Beschreibung meines Problems. Vielleicht könnt ihr mir weiter helfen. Ich habe vorher viel mit C# gemacht und dort war es eigentlich immer egal, in welcher Reihenfolge Klassen im Namepspace erscheinen. Fogendes Beispiel hat mich ein wenig stutzig gemacht:

Code: Alles auswählen

def function():
    a = A()  # Ist kein Problem


class C(A):  # hier bekomme ich von Pycharm einen 'unresolved reference' Fehler und der Interpreter sagt:
    pass         # "NameError: name 'A' is not defined"


class A:
    pass


class B(A):
    pass  # funktioniert wie erwartet
Warum wird A bei der Vererbung nicht erkannt (weil es im Code weiter unten steht) aber ich kann ohne Probleme innerhalb einer Funktion ein Objekt von A instanziieren?
__deets__
User
Beiträge: 9685
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 16. April 2021, 13:33

Weil der Code spaeter laeuft. class C(A) ist Code der in dem Moment ausgefuehrt wird, und da fehlt eben A. function ist Code der nur ein Funktionsobjekt anlegt, erst wenn man das *aufruft* wird versucht, alles, was darin vorkommt, auszufuehren. Du koenntest auch

Code: Alles auswählen

def function():
     a = SchnibbelBurz()
schreiben, und das wuerde auch geschluckt - auch wenn es niemals nirgendwo ein SchnibbelBurz gibt. Aber natuerlich kracht es dann bei Ausfuehrung.
"Herr Fachmann, wie bohre ich mir ein Loch ins Knie?"

"Das sollten sie nicht tun! Und wenn man operiert, muss man auf Hygiene achten, und nicht einen Bohrer, der gerade in der Wand ein Loch gebohrt hat, nehmen."

"Das war nicht meine fachliche Frage!!"
Benutzeravatar
__blackjack__
User
Beiträge: 8573
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 16. April 2021, 20:05

@mak112358: Der Code wird der Reihe nach ausgeführt. ``def`` und ``class`` sind ausführbare Anweisungen die wenn sie ausgeführt werden, Funktionen und Klassen erzeugen. Das ``def function():`` definiert eine Funktion. Danach gibt es den Namen `function` der an diese Funktion gebunden ist. Dann folgt eine ``class C(A)``-Anweisung welche `C` definieren würde, aber da hier `A` verwendet wird, was zu diesem Zeitpunkt noch undefiniert ist, kracht das.

Der *Aufruf* von `function` funktioniert erst wenn `A` definiert wurde. Wenn Du versuchst `function` direkt nach der Definition aufzurufen, bevor `A` definiert wurde, wird das auch nicht funktionieren:

Code: Alles auswählen

def function():
    a = A()  # Ist kein Problem

funktion()  #  Gibt an dieser Stelle einen `NameError`.

class A:
    pass

function()  # Hier funktioniert es, denn an dieser Stelle im Programmablauf ist `A` definiert.
Der Unterschied zu C# ist das bei Python ``def`` und ``class`` nicht zur Übersetzungszeit vom Compiler zu statischen Funktionen und Klassen übersetzt werden, sondern das Anweisungen sind, die zur Laufzeit Funktions- und Klassenobjekte erstellen.
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
Antworten