Klasse funktioniert nicht...wo ist der Fehler?

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
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

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...
Zuletzt geändert von Monsi am Donnerstag 26. Februar 2009, 13:28, insgesamt 1-mal geändert.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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])
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

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....
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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?
Das Leben ist wie ein Tennisball.
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

mh...was ist IDLE?

ich versuch es noch mal.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Monsi hat geschrieben:"Set" ist ein eingebauter Befehl? Was macht Set denn?
Set implementiert Mengen: http://docs.python.org/tutorial/datastr ... .html#sets
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

Es kommt immer die Fehlermeldung 'Set has no attribute "concat"'. Das funktionierte weder gestern noch heute und ich habe keine komischen Dinge gemacht
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

Danke fur die Info bezueglich Set. Aber auch wenn ich die Klasse anders benenne, geht es nicht.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

welchen editor nutzt du
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

kwrite
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der Name "Set" geht schon in Ordnung. Was kbr meint ist "set" und das dürfte bei dir keine Probleme machen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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.
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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?
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

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.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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 ;-).
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ?
Monsi
User
Beiträge: 23
Registriert: Mittwoch 4. Februar 2009, 10:29

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.
Antworten