Fehler bei diesem Programm

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
PyJava
User
Beiträge: 2
Registriert: Freitag 25. Dezember 2015, 19:52

Freitag 25. Dezember 2015, 20:00

Hallo,
Ich hoffe ich bin hier im richtigen Forum.
Hab grade erst mit Python angefangen und weiß deshalb nicht was der Fehler bei diesem Programm ist.

Code: Alles auswählen

class programm():
    
    def __init__(self):
        self.x = 5
 
    def drucken(self):
        print(self.x)
    
    def main(self):
        drucken()
    
    
    if __name__ == '__main__':
        main()
Zuletzt geändert von Anonymous am Freitag 25. Dezember 2015, 20:04, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Freitag 25. Dezember 2015, 20:11

@PyJava: *Der* Fehler ist gut. Vielleicht verrätst auch was das machen soll, denn da sieht einiges falsch aus. Die ``if __name__ …``-Abfrage gehört beispielswiese nicht in die Klasse sondern auf Modulebene und ruft von dort üblicherweise eine `main()`-*Funktion* auf. Und dann müsstest Du auch erst einmal ein Exemplar vom Typ `programm` erstellen bevor Du Methoden darauf aufrufst. Ausserdem musst Du immer das Objekt angeben auf dem eine Methode aufgerufen wird. Der ``drucken()``-Aufruf in der `main()`-Methode sucht erst lokal in der Methode und dann auf Modulebene nach dem Namen `drucken` und wird den dort nicht finden. Weil Du Java in Deinem Nutzernamen hast: `self` wird da nicht auf magische Weise angenommen wie `this` bei Java. Es wird als Argument in die Methode rein gebracht und man muss darüber gehen um an Attribute von dem Objekt zu kommen auf dem die Methode aufgerufen wurde.
BlackJack

Freitag 25. Dezember 2015, 20:18

Das könnte beispielsweise so aussehen:

Code: Alles auswählen

class Program(object):

    def __init__(self):
        self.x = 5

    def print(self):
        print(self.x)


def main():
    Program().print()


if __name__ == '__main__':
    main()
Wobei die Klasse hier keinen Sinn macht. Klassen mit nur `__init__()` und nur einer zusätzlichen Methode, von denen man nur ein Exemplar erstellt um diese eine Methode drauf aufzurufen und das Exemplar dann gleich wieder verwirft sind oft ein Zeichen das man eine einfache Funktion unnötigerweise in eine Klasse gesteckt hat.
Benutzeravatar
pillmuncher
User
Beiträge: 1110
Registriert: Samstag 21. März 2009, 22:59
Wohnort: München

Freitag 25. Dezember 2015, 20:22

:shock: BlackJack verwendet Python3? Ja is denn heut scho Weihnachten?
In specifications, Murphy's Law supersedes Ohm's.
PyJava
User
Beiträge: 2
Registriert: Freitag 25. Dezember 2015, 19:52

Freitag 25. Dezember 2015, 20:43

Ok vielen dank :)
Benutzeravatar
bwbg
User
Beiträge: 379
Registriert: Mittwoch 23. Januar 2008, 13:35

Freitag 25. Dezember 2015, 20:50

@pillmuncher: Ja, BlackJack hat sich zur Feier des Tages den __future__-import geschenkt :D

Pythonisch würde ich das eingangs skizzierte Programm wie folgt schreiben:

Code: Alles auswählen

#!/usr/bin/env python3

def main():
    print(5)
    
    
if __name__ == '__main__':
    main()
PS: Für mich scheint die Code-Vorschau immer noch nicht zu funktionieren.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten