Seite 1 von 1

Probleme beim Beschreiben einer Variable

Verfasst: Mittwoch 2. April 2014, 23:52
von Papp Nase
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?

Re: Probleme beim Beschreiben einer Variable

Verfasst: Mittwoch 2. April 2014, 23:56
von Leonidas
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.

Re: Probleme beim Beschreiben einer Variable

Verfasst: Donnerstag 3. April 2014, 00:03
von 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

Re: Probleme beim Beschreiben einer Variable

Verfasst: Donnerstag 3. April 2014, 00:46
von Papp Nase
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.

Re: Probleme beim Beschreiben einer Variable

Verfasst: Donnerstag 3. April 2014, 01:03
von Leonidas
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.