Seite 1 von 1

Klasse funktioniert nicht...wo ist der Fehler?

Verfasst: Donnerstag 26. Februar 2009, 12:23
von Monsi
Hallo,

in den letzten Tagen habe ich mir ein grundlegendes Verstaendnis erarbeitet, was Klassen machen und wofuer sie gut sind. Nun versuche ich ein Beispiel aus einem Buch nachzuvollziehen, aber irgendwo muss ein Fehler sein, denn die Anwendung funktioniert nicht. Mit ist klar, was die Klasse macht, sie erweitert eingebaute Objekttypen, huellt ein Listenobjekt ein und exportiert Methoden zum Einfuegen und Loeschen, die die Liste bearbeiten. Aber wenn ich mir zwei Listen erstelle, und die Klasse mit ihren Methoden darauf anwenden will, kommen diverse Fehlermeldungen. Kann mir jemand sagen, was daran falsch ist?

Code: Alles auswählen

[code=]
class Set:
    def __init__(self, value = []):
         self.data = []
         self.concat(value)

    def intersect(self, other):
         res = []
         for x in self.data:
             if  x in other:
                 res.append(x)
         return Set(res)

    def union(self, other):
         res = self.data[:]
         for x in other:
             if not x in res:
                  res.append(x)
         return Set(res)

    def concat(self, value):
         for x in value:
             if not x in self.data:
                   self.data.append(x)

    def __len__(self):                return len(self.data)
    def __getitem__(self, key):   return self.data[key]
    def __and__(self, other):      return self.intersect(other)
    def __or__(self, other):        return self.union(other)
    def __repr__(self):              return 'Set:' + `self.data`
[/code]

Wenn ich nun

Code: Alles auswählen

x = Set([1,2,3,4])

und

y = Set([3,4,5])
erstellen will, kommt folgendes:

"Set instance has no attribut 'concat'"

wenn ich den ersten Teil der Klasse dahingehend veraendere:

Code: Alles auswählen

class Set:
    def __init__(self, value = []):
         self.data = value
funktioniert das Erstellen der Instanzen, aber wenn ich die Methoden anwenden will, klappt das nicht. Ich komme nicht darauf, weshalb, wahrscheinlich sehe ich mal wieder den Wald vor lauter Baeumen nicht...

Verfasst: Donnerstag 26. Februar 2009, 12:45
von sea-live
SET ist ein reservierter befehl aufpassen

versuchs mal so

Code: Alles auswählen

class Set:
    def __init__(self, value = []):
         self.data = []
         self.concat(value)

    def intersect(self, other):
         res = []
         for x in self.data:
             if  x in other:
                 res.append(x)
         return res

    def union(self, other):
         res = self.data[:]
         for x in other:
             if not x in res:
                  res.append(x)
         return res

    def concat(self, value):
         for x in value:
             if not x in self.data:
                   self.data.append(x)

x = Set([1,2,4,5])
print x.intersect([2,5,3,7])
print x.union([2,5,3,7])

Verfasst: Donnerstag 26. Februar 2009, 13:27
von Monsi
Die Klasse ist aber jetzt noch genau so wie ich sie eben geschrieben hatte..und dann klappt das Erstellen der Instanz gar nicht erst. "Set" ist ein eingebauter Befehl? Was macht Set denn? Denn wenn ich mir die Informationen dazu anzeigen lasse, wird mir nur die Klasse angegeben....

Verfasst: Donnerstag 26. Februar 2009, 13:34
von EyDu
Bei mir funktioniert die Klasse problemlos und ich sehe auch keinen Grund, warum sie das nicht tun sollte. Machst du vielleicht komische Dinge mit IDLE?

Verfasst: Donnerstag 26. Februar 2009, 13:36
von Monsi
mh...was ist IDLE?

ich versuch es noch mal.

Verfasst: Donnerstag 26. Februar 2009, 13:38
von kbr
Monsi hat geschrieben:"Set" ist ein eingebauter Befehl? Was macht Set denn?
Set implementiert Mengen: http://docs.python.org/tutorial/datastr ... .html#sets

Verfasst: Donnerstag 26. Februar 2009, 13:38
von Monsi
Es kommt immer die Fehlermeldung 'Set has no attribute "concat"'. Das funktionierte weder gestern noch heute und ich habe keine komischen Dinge gemacht

Verfasst: Donnerstag 26. Februar 2009, 13:39
von Monsi
Danke fur die Info bezueglich Set. Aber auch wenn ich die Klasse anders benenne, geht es nicht.

Verfasst: Donnerstag 26. Februar 2009, 13:41
von sea-live
welchen editor nutzt du

Verfasst: Donnerstag 26. Februar 2009, 13:42
von Monsi
kwrite

Verfasst: Donnerstag 26. Februar 2009, 13:46
von EyDu
Der Name "Set" geht schon in Ordnung. Was kbr meint ist "set" und das dürfte bei dir keine Probleme machen.

Verfasst: Donnerstag 26. Februar 2009, 14:05
von cofi
Sowohl deine als auch meine - leicht veränderte - Fassung funktionieren.
Aber in einer Interpretersitzung seltsamerweise nicht, kann es vielleicht sein, dass du sie in den Interpreter eingibst, anstatt es per `python skript.py' aufzurufen?

Code: Alles auswählen

class Set(object):
    def __init__(self, value = None):
         self.data = value if value else []
         self.concat(value)

    def intersect(self, other):
         res = []
         for x in self.data:
             if  x in other:
                 res.append(x)
         return Set(res)

    def union(self, other):
         res = self.data[:]
         for x in other:
             if not x in res:
                  res.append(x)
         return Set(res)

    def concat(self, value):
         for x in value:
             if not x in self.data:
                   self.data.append(x)

    def __len__(self):                return len(self.data)
    def __getitem__(self, key):   return self.data[key]
    def __and__(self, other):      return self.intersect(other)
    def __or__(self, other):        return self.union(other)
    def __str__(self):              return "Set: %s" % self.data
    def __repr__(self):              return "<Set(%s(`)>" % `self.data`

if __name__ == '__main__':
    s = Set([1,2,3])
    print s

Verfasst: Donnerstag 26. Februar 2009, 14:11
von helduel
Funzt bei mir aber auch in der Interpreter-Sitzung. man muss halt darauf achten, dass zwischen den Methoden hier keine Leerzeilen sind.

Ist's vielleicht bloß ein Indent-Problem? Dass die concat-Methode als Funktion definiert wurde anstatt als Methode?

Einfach mal in der Sitzung "concat" eintippen und schauen, was passiert.

Verfasst: Donnerstag 26. Februar 2009, 15:15
von Monsi
Ja, ich habe es in den Interpreter eingegeben. Aber das duerfte eigentlich keinen Unterschied machen, oder liege ich da falsch?

Und warum sollte zwischen den Methoden keine Leerzeile sein? das hat bis jetzt nie Probleme gemacht, solange die Methoden eingefuegt werden bevor die Klasse geschlossen ist. Eingerueckt ist auch alles richtig.

Verfasst: Donnerstag 26. Februar 2009, 15:31
von cofi
Es macht wohl einen Unterschied ;)

Aber warum nimmst du nicht gleich Kate - das hat auch gleich ein Terminal? Beziehungsweise warum machst du dir die Mühe das einzugeben, wenn du eh in einem Editor schreibst?

Verfasst: Donnerstag 26. Februar 2009, 15:36
von Monsi
Also, ihr hattet Recht..die Leerzeilen zwischen den Methodendefinitionen waren nicht richtig eingerueckt, weshalb das Eingeben in den Interpreter durch Kopieren aus dem Editor nicht so funktioniert hat, wie ich das gerne haette.

Zu der Frage, warum ich nicht Kate nehme(ich nehme an das ist ein Editor): ich arbeite seit Februar zum ersten Mal mit Linux und Python und habe nie zuvor selbst was programmiert (mit Ausnahme von R, was aber eher ein Kinderspiel war im Vergleich zu Python). Ich bin froh dass ich soweit gekommen bin, weil ich mir das alles durch Learning-by-doing aneigne und deshalb habe ich auch keine Ahnung welchen Editor ich am besten verwende etc.

Verfasst: Donnerstag 26. Februar 2009, 15:59
von helduel
Monsi hat geschrieben:Und warum sollte zwischen den Methoden keine Leerzeile sein?
Probier's mal. Paste deinen Code in die Sitzung:

Code: Alles auswählen

>>> class Set:
...     def __init__(self, value = []):
...          self.data = []
...          self.concat(value)
... 
>>>     def intersect(self, other):
  File "<stdin>", line 1
    def intersect(self, other):
    ^
SyntaxError: invalid syntax
Mag sein, dass sowas mit IDLE oder so nicht passiert.

Edit: Ups, da war ja noch ne 2. Seite ;-).

Verfasst: Donnerstag 26. Februar 2009, 16:08
von cofi
Zu Kate: Ja, das ist ein Editor. Genauer gesagt Kwrite Deluxe ;) Ich dachte du wärst mit KDE vertraut (sonst würdest du Kwrite ja nicht benutzen ;) ) darum hab ich das Kommentarlos fallen gelassen.
Teste ihn einfach mal. Aber das erklärt noch nicht warum du das in den Interpreter schreibst. Kann es sein, dass du nicht wusstest, dass man Python Skripte auch direkt ausführen kann ?

Verfasst: Donnerstag 26. Februar 2009, 16:32
von Monsi
Doch, ich wusste das man die Skripte einlesen kann. Aber ich mache das lieber selbst Schritt fuer Schritt, um mir veranschaulichen zu koennen, was nach jedem einzelnen Schritt geschieht. Vielen Dank fuer all die hilfreichen Kommentare, dank euch (und meinem Zimmerkollegen) habe ich heute einige Dinge klaeren koennen, mit denen ich gehadert habe.