Seite 1 von 1

Fehlermeldung OOP

Verfasst: Samstag 12. Juli 2014, 21:00
von Xfd7887a
Ich versuche gerade eine Notizverwaltung zu schreiben. Dazu folgender Code:

Code: Alles auswählen

import os.path
from datetime import datetime


class Notiz(object):

    def __init__(self, titel, datum, inhalt):
        self.titel = titel
        self.datum = datum
        self.inhalt = inhalt

    def __str__(self):
        return "%s\n%s" % (self.titel, self.inhalt)


class NotizbuchDB(object):

    def __init__(self, notizen):
        self.notizen = notizen

    def notiz_anlegen(self, neue_notiz):
        self.notizen[neue_notiz.titel] = neue_notiz


class Controller(object):

    def __init__(self):
        self.notizen = self.notizen_laden
        self.notizbuch = NotizbuchDB(self.notizen)

    def notizen_laden(self):
        self.notizen = {}

    def neue_notiz_anlegen(self):
        titel = raw_input("Titel: ")
        inhalt = raw_input("Notiz: ")
        datum = datetime.now

        neue_notiz = Notiz(
            titel, datum, inhalt
        )

        self.notizbuch.notiz_anlegen(neue_notiz)


def main():
    control = Controller()
    control.neue_notiz_anlegen()

if __name__ == '__main__':
    main()
Und diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "notizen.py", line 54, in <module>
    main()
  File "notizen.py", line 51, in main
    control.neue_notiz_anlegen()
  File "notizen.py", line 46, in neue_notiz_anlegen
    self.notizbuch.notiz_anlegen(neue_notiz)
  File "notizen.py", line 22, in notiz_anlegen
    self.notizen[neue_notiz.titel] = neue_notiz
TypeError: 'instancemethod' object does not support item assignment
Warum kommt diese Fehlermeldung?

Re: Fehlermeldung OOP

Verfasst: Samstag 12. Juli 2014, 21:25
von BlackJack
@Xfd7887a: Das steht da doch eigentlich superdeutlich. Du versuchst auf einer Methode einen Indexzugriff. Was denkst Du denn was `self.notizen` an der Stelle für einen Wert hat? Lass Dir den doch mal vorher ausgeben. Und dann verfolge zurück wo der her kommt.

Re: Fehlermeldung OOP

Verfasst: Samstag 12. Juli 2014, 21:32
von Xfd7887a
Habe das Problem gefunden, danke :D.

Re: Fehlermeldung OOP

Verfasst: Samstag 12. Juli 2014, 21:49
von snafu
Krass, wie man es schafft, eine so simple Aufgabe mit einem so komplizierten Entwurf zu realisieren. :twisted:

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 08:02
von Sirius3
@Xfd7887a: das Problem ist, dass »notizen_laden« nichts in »Controller« zu suchen hat, und damit auch »notizen« da fehl am Platz ist. Zeile 37 solltest Du Dir auch nochmal anschauen.

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 16:24
von Xfd7887a
Ich habe ein neues Problem:

Code: Alles auswählen

class Notiz(object):
   ...
    def __str__(self):
        return "%s\n%s" % (self.titel, self.inhalt)

class NotizbuchDB(object):
   ...
    def __str__(self):
        for eintrag in self.notizen:
            print eintrag

class Controller(object):
   ...
    def notizen_anzeigen(self):
        print self.notizbuch

Code: Alles auswählen

Traceback (most recent call last):
  File "notizen.py", line 55, in <module>
    main()
  File "notizen.py", line 52, in main
    control.notizen_anzeigen()
  File "notizen.py", line 46, in notizen_anzeigen
    print self.notizbuch
TypeError: __str__ returned non-string (type NoneType)
__str__ return doch einen String, oder nicht?

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 16:33
von BlackJack
@Xfd7887a: Nein die Methode gibt `None` zurück, weil am Ende von Methoden quasi ein implizites ``return None`` steht. Die Methode muss eine Zeichenkette an den Aufrufer *zurück*geben, und nicht irgenwas mit ``print`` *aus*geben.

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 19:11
von Xfd7887a
Habe mein Script jetzt erweitert:

Code: Alles auswählen

from time import localtime
from pickle import load, dump
import os.path


class Notiz(object):

    def __init__(self, titel, datum, inhalt):
        self.titel = titel
        self.datum = datum
        self.inhalt = inhalt

    def __str__(self):
        return "%s\n%s" % (self.titel, self.inhalt)


class NotizbuchDB(object):

    def __init__(self, notizen):
        self.notizen = notizen

    def notiz_anlegen(self, neue_notiz):
        self.notizen[neue_notiz.titel] = neue_notiz

    def notiz_loeschen(self, titel):
        del self.notizen[titel]

    def notiz_bearbeiten(self, titel):
        self.notizen[titel].inhalt = inhalt

    def notiz_suchen(self, titel):
        if self.notizen[titel]:
            print self.notizen[titel]
        else:
            print "Notiz nicht gefunden!"

    def anzeigen(self):
        for eintrag in self.notizen:
            print eintrag


class Controller(object):

    def __init__(self):
        self.notizen = self.notizen_laden()
        self.notizbuch = NotizbuchDB(self.notizen)

    def notizen_laden(self):
        if os.path.isfile("notizen.txt"):
            with open("notizen.txt") as datei:
                notizen = load(datei)
            return notizen
        else:
            return {}

    def notizen_speichern(self):
        with open("notizen.txt", "w") as datei:
            dump(self.notizen, datei)

    def neue_notiz_anlegen(self):
        titel = raw_input("Titel: ")
        inhalt = raw_input("Notiz: ")

        self.notizbuch.notiz_anlegen(
            Notiz(titel, localtime(), inhalt)
        )

    def notiz_loeschen(self):
        titel = raw_input("Titel: ")
        if raw_input("Notiz wirklich loeschen? ") == "ja":
            self.notizbuch.notiz_loeschen(titel)

    def notiz_aktualisieren(self):
        titel = raw_input("Titel: ")
        self.notizbuch.notiz_bearbeiten(titel)

    def notiz_suchen(self):
        titel = raw_input("Titel: ")
        self.notizbuch.notiz_suchen(titel)

    def notizen_anzeigen(self):
        self.notizbuch.anzeigen()


def main():
    control = Controller()

    menue = [
        ["Notizen anzeigen", control.notizen_anzeigen()],
        ["Neue Notiz", control.neue_notiz_anlegen()],
        ["Notiz loeschen", control.notiz_loeschen()],
        ["Notiz bearbeiten", control.notiz_aktualisieren()],
        ["Notiz suchen", control.notiz_suchen()]
    ]

    while True:
        for index, item in enumerate(menue, 1):
            print "{}  {}".format(index, item[0])

        auswahl = int(raw_input("> ")) - 1
        menue[auswahl][1]()

    control.notizen_speichern()

if __name__ == '__main__':
    main()
Jetzt startet das Programm mit der Ausgabe von "Titel:" und erwartet eine Eingabe. Wieso? Sollte es nicht eigentlich das Menü anzeigen?

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 19:19
von BlackJack
@Xfd7887a: In `menue` müsstest Du den Text und die jeweils dazugehörige Methode speichern, Du rufst die Methode stattdessen aber auf und speicherst damit deren *Rückgabewerte* in der Struktur. Bei ``control.notizen_anzeigen()`` sieht man davon noch nichts weil noch keine Notizen da sind, aber in der nächsten Zeile rufst Du die Methode zum anlegen einer neuen Notiz auf, und die Fragt den Benutzer nach einem Titel.

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 19:23
von Xfd7887a
Stimmt, habe ich übersehen :D Danke

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 19:27
von Xfd7887a
Jetzt habe ich noch folgendes Problem:

Code: Alles auswählen

    def notiz_bearbeiten(self, titel):
        self.notizen[titel].inhalt = inhalt
Das scheint so nicht zu gehen. Wie kann ich eine Notiz bearbeiten?

Re: Fehlermeldung OOP

Verfasst: Sonntag 13. Juli 2014, 19:30
von EyDu
*Was* geht denn nicht? Was soll passieren und was passiert tatsächlich? Gibt es eine Fehlermeldung und wenn ja, welche? Wie lautet ggf. der Traceback? Die meisten von uns haben leider nur defekte Glaskugeln.

Re: Fehlermeldung OOP

Verfasst: Montag 14. Juli 2014, 21:02
von Hyperion
Xfd7887a hat geschrieben:Stimmt, habe ich übersehen :D Danke
Da musst Du das nächste mal aber das Tutorial genauer durcharbeiten ;-)

Re: Fehlermeldung OOP

Verfasst: Sonntag 20. Juli 2014, 17:31
von Xfd7887a
EyDu hat geschrieben:*Was* geht denn nicht? Was soll passieren und was passiert tatsächlich? Gibt es eine Fehlermeldung und wenn ja, welche? Wie lautet ggf. der Traceback? Die meisten von uns haben leider nur defekte Glaskugeln.
Folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/ich/Documents/Projekte/Notizverwaltung/src/notizen.py", line 107, in <module>
    main()
  File "/Users/ich/Documents/Projekte/Notizverwaltung/src/notizen.py", line 104, in main
    menue[auswahl][1]()
  File "/Users/ich/Documents/Projekte/Notizverwaltung/src/notizen.py", line 77, in notiz_aktualisieren
    self.notizbuch.notiz_bearbeiten(titel)
  File "/Users/ich/Documents/Projekte/Notizverwaltung/src/notizen.py", line 30, in notiz_bearbeiten
    self.notizen[titel].inhalt = inhalt
NameError: global name 'inhalt' is not defined
Warum ist "Inhalt" nicht vorhanden?

Re: Fehlermeldung OOP

Verfasst: Sonntag 20. Juli 2014, 17:36
von Xfd7887a
Habe das Problem gelöst. Wenn man keinen neuen Inhalt übergibt, kann man natürlich alten nicht überschreiben :D

Re: Fehlermeldung OOP

Verfasst: Sonntag 20. Juli 2014, 17:56
von cofi
Fuer die Zukunft: Falls du zu einem Traceback keinen Code lieferst, koennen wir dir wahrscheinlich auch nur die Fehlermeldung vorlesen.