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

Donnerstag 26. Februar 2009, 12:23

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

Donnerstag 26. Februar 2009, 12:45

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

Donnerstag 26. Februar 2009, 13:27

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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 26. Februar 2009, 13:34

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

Donnerstag 26. Februar 2009, 13:36

mh...was ist IDLE?

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

Donnerstag 26. Februar 2009, 13:38

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

Donnerstag 26. Februar 2009, 13:38

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

Donnerstag 26. Februar 2009, 13:39

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

Donnerstag 26. Februar 2009, 13:41

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

Donnerstag 26. Februar 2009, 13:42

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

Donnerstag 26. Februar 2009, 13:46

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

Donnerstag 26. Februar 2009, 14:05

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

Donnerstag 26. Februar 2009, 14:11

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

Donnerstag 26. Februar 2009, 15:15

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

Donnerstag 26. Februar 2009, 15:31

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