Klassendeklaration vor der Verwendung?

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
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

Hallo zusammen,

ich komme aus der JAVA Ecke und arbeite mich gerade in Python ein.
Muss ich in Python bevor ich eine Kasse verwende, diese "weiter oben" deklariert haben?

Es gibt bestimmt bereits eine Antwort im Web; ich weiß aber leider nicht, nach welchen Schlagwörtern ich hier suchen muss.
ich bitte daher um Nachsicht :D

Danke, viele Grüße
Mario
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, bevor man einen Namen verwenden will (und da ist es egal, ob es sich um eine Klassendefinition, Funktion oder Konstante handelt) muß man sie definieren.
Was meinst Du aber mit "deklarieren"?
Zeige Code, der Deiner Meinung nach Probleme macht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Anders als bei C/C++ geht in Python sowas problemlos:

Code: Alles auswählen

def tuwas():
     egal = MeineKlasse()


class MeineKlasse:
     ....


if __name__ == "__main__": # import guard, einfach mal hier suchenr
     tuwas()
Es kommt also auf die *Ausfuehrungsreihenfolge* an. tuwas kann definiert werden (Deklarationen in Python gibt es nicht, ebensowenig wie in Java) bevor MeineKlasse.

Was natuerlich nicht geht ist tuwas aufzurufen, bevor der Interpreter an "class MeineKlasse" vorbeigekommen ist.
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

Zur Klarstellung

Ursprünglich war mein Coding (erst Klasse, dann prozessieren der Klasse)

Code: Alles auswählen

# neural network class definition
class neuralNetwork:
    
    
    # initialise the neural network
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        # set number of nodes in each input, hidden, output layer
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        .....

Code: Alles auswählen


# create instance of neural network
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
Nachdem ich die Blöcke vertauscht habe, hat es nicht mehr funktioniert :|
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Klassen schreibt man gross: NeuralNetwork. Benutze keine Abkürzungen: warum self.inodes statt self.inputnodes?

Python ist eine dynamische Sprache, das heißt, dass auch Funktionen und Klassen erst zur Laufzeit erzeugt werden. Wenn also die Klassendefinition noch nicht verarbeitet wurde, existiert die Klasse nicht.

Auf oberster Ebene sollte kein ausführbarer Code stehen, nur Klassen- oder Funktionsdefinitionen, wie __deets__ das ja schon in seinem Beispiel gezeigt hat. Damit hat man auch kein Problem, in welcher Reihenfolge welche Definitionen geschrieben werden.

Die Kommentare sind allesamt unnötig, weil sie nur das beschreiben, was in der nächsten Zeile eh schon als Code steht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie ich schon schrieb, sowas geht nicht:

Code: Alles auswählen

tuwas()

def tuwas():
    pass
Und dabei ist egal, ob tuwas eine Funktion oder eine Klasse ist.

Python arbeitet eine Datei zeilenweise ab. Es gibt keine vorherige Analyse, was darin Klassen und Funktionen sind, und die wuerden dann zuerst ausgefuehrt.

Weshalb auch gilt: auf oberster Modulebene gehoeren NUR

- importe
- KONSTANTEN
- Funktions- und Klassendefinitionen

Wenn gibt es *ganz am Ende* einen import-Guard:

Code: Alles auswählen

if __name__ == "__main__":
    main() # oder eine andere Funktion
# ende der Datei
Und noch eine Anmerkung zum Schluss: coding ist eine Taetigkeit, nicht das Ergebnis dieser Taetigkeit. "I was coding in the park". Das Result dieses Ausflugs ins Gruene ist "Code".
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

Danke an Alle; ich habe es verstanden! Das war sehr hilfreich :mrgreen:

BTW: Das Coding stammt nicht von mir :P
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das mag sein, aber Coding ist immer noch der falsche Begriff. Es ist ja nicht so, als wir in Deutschland nicht eine lange Tradition von falsch uebernommenen Begriffen aus dem Englischen haetten. "Handy", "Bodybag", "for better understanding" oder der gute alte Klassiker "Douglas - come in and find out", bei dem der native Speaker sich wundert, warum man denn hereinkommen sollte, wenn man dann gleich wieder raus finden will...
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

:D
__deets__ hat geschrieben: Freitag 21. August 2020, 12:09 Das mag sein, aber Coding ist immer noch der falsche Begriff. Es ist ja nicht so, als wir in Deutschland nicht eine lange Tradition von falsch uebernommenen Begriffen aus dem Englischen haetten. "Handy", "Bodybag", "for better understanding" oder der gute alte Klassiker "Douglas - come in and find out", bei dem der native Speaker sich wundert, warum man denn hereinkommen sollte, wenn man dann gleich wieder raus finden will...
Antworten