Probleme beim Beschreiben einer Variable

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
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Hallo,

ich habe eine Frage zu Variablen, die ich mir in Klassen definiere.

Das Probramm ist nicht lauffähig, es soll nur das Problem veranschaulichen:

Code: Alles auswählen

class MyClass:
   def __init__ (self):
       self.myvar = "Hallo Welt"

Param = MyClass.init()

try: 
   Param.myvar = Irgendwas (...)
except:
   print "Fehler"

print Param.myvar
Die letzte Zeile ist "problematisch"

Code: Alles auswählen

print Param.myvar
Geht das Programm in den except-Bereich, dann kommt bei der Anweisung print Param.myvar die Fehlermeldung: Wert hat kein Attribut.

Aber ich habe doch bei der Klasse beim Initialisen der Klasse einen Initialwert "Hallo Welt" gesetzt. Kann es jetzt sein, dass durch die nicht erfolgreiche Zuweisung im try-Bereich auch der Initialwert gelöscht wurde?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Aber du hast nirgendwo die Klasse instanziiert. Zeile 5 ruft nur die Methode ``init`` auf, die in Python keine spezielle Bedeutung hat und die du zumindest in deinem Code nicht definierst. So wird ``__init__`` nie aufgerufen und dementsprechend ``myvar`` nicht gesetzt. In Zeile 8 müsste es jedoch gesetzt werden, da kann keine Ausnahme wegen des Setzens kommen, höchstens wenn ``Irgendwas(…)`` eine Ausnahme wirft.

Fazit: dein Beispielcode ist so kaputt, er illustriert nichts weil er vollständig falsch ist und dein eigentliches Problem kann jetzt alles mögliche sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Die Theorie kann man mit tatsächlich lauffähigem Quelltext leicht überprüfen:

Code: Alles auswählen

#!/usr/bin/env python


class Spam(object):
    def __init__(self):
        self.eggs = 42


def main():
    spam = Spam()

    try:
        spam.eggs = 1 / 0
    except Exception as error:
        print 'Fehler:', error

    print spam.eggs


if __name__ == '__main__':
    main()
Ausgabe:

Code: Alles auswählen

Fehler integer division or modulo by zero
42
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Vielen Dank für Eure Antworten.
Leonidas hat geschrieben:Aber du hast nirgendwo die Klasse instanziiert. Zeile 5 ruft nur die Methode ``init`` auf, die in Python keine spezielle Bedeutung hat und die du zumindest in deinem Code nicht definierst ...
Was ist mit Zeile 3 in meinem Quellcode? Dort habe ich myvar einen Initialwert zugewiesen. Rufe ich die Anweisung print Param.myvar VOR der try-except-Anweisung auf, dann steht der Initialwert drinnen. Ich verstehe deshalb Deine Anmerkung nicht, weshalb __init__ keine Bedeutung haben soll, kannst Du mir das vielleicht erklären?
Leonidas hat geschrieben:... Fazit: dein Beispielcode ist so kaputt, er illustriert nichts weil er vollständig falsch ist und dein eigentliches Problem kann jetzt alles mögliche sein.
Was ist denn an meinem Beispielcode so kaputt oder vollständig falsch? Ich meine, das Programm läuft doch - ich rufe mit "irgendwas ..." eine Funktion auf, die irgendetwas macht - entweder, sie weist einen Wert zu, z.B. einen String oder aber es gibt einen Fehler, dann ist aber nach Aufruf der try-except-Anweisung der Initialwert auch nicht mehr vorhanden, sondern es kommt bei mir die genannte Fehlermeldung. Tritt jedoch kein Fehler auf - also geht das Programm nicht in den except-Teil, dann wird der neue Wert übernommen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Papp Nase hat geschrieben:Vielen Dank für Eure Antworten.
Leonidas hat geschrieben:Aber du hast nirgendwo die Klasse instanziiert. Zeile 5 ruft nur die Methode ``init`` auf, die in Python keine spezielle Bedeutung hat und die du zumindest in deinem Code nicht definierst ...
Was ist mit Zeile 3 in meinem Quellcode? Dort habe ich myvar einen Initialwert zugewiesen. Rufe ich die Anweisung print Param.myvar VOR der try-except-Anweisung auf, dann steht der Initialwert drinnen. Ich verstehe deshalb Deine Anmerkung nicht, weshalb __init__ keine Bedeutung haben soll, kannst Du mir das vielleicht erklären?
Instanziieren einer Klasse geht so:

Code: Alles auswählen

Param = MyClass()
Dabei wird ``__init__`` ausgeführt, nicht jedoch bei

Code: Alles auswählen

Param = MyClass.init()
was eine Klassenmethode ``init`` ausführt, nicht jedoch ``__init__``. BlackJack hat ja inzwischen eine korrigierte Version des Quellcodes gepostet die das von dir beschriebene Problem ja offensichtlich nicht aufweist, weil ``eggs`` 42 ist, wie in ``__init__`` definiert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten