Python Doku: von list / dict erben...

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. Juli 2008, 12:00

Komisch, immer wenn ich mal von list oder dict erben möchte, suche ich in der Doku vergeblich an Informationen darüber wie man das macht.

Übersehe ich da was?

Wenn es dazu nichts gibt, würde ich mal eine Wiki Seite anlegen wollen.

Anhaltspunkte: Alternativen: Kennt noch wer gute Links zum Thema?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 21. Juli 2008, 12:06

Ähm, was sind denn deine Schwierigkeiten mit ``list`` und ``dict``? Im Allgemeinen erbt man davon so ab, wie von allem anderen auch.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. Juli 2008, 12:14

Die Schwierigkeit ist, ich vergesse immer wider wie ich Methoden überschreiben kann bzw. wie ich an die Listen/Dict daten herran komme.

Ein Beispiel ähnlich wie diese hier wäre hilfreich:

Code: Alles auswählen

class MyList(list):
    def append(self, value):
        print "append:", value
        list.append(self, value)

    def extend(self, value):
        print "extend:", value
        list.extend(self, value)

    def insert(self, index, value):
        print "insert %r at position: %i" % (value, index)
        list.insert(self, index, value)

    def __repr__(self):
        repr = "my own repr: >>>%s<<<" % list.__repr__(self)
        return repr

    def test(self):
        for item in list:
            print item

l = MyList()
l.append("FooBar")
l.extend(["Foo", "Bar"])
l.insert(0, "First!")
l += [1,2,3]

print l

print "-"*80

l.test()
Und da hab ich noch eine Frage, denn die Ausgabe sieht so aus:

Code: Alles auswählen

append: FooBar
extend: ['Foo', 'Bar']
insert 'First!' at position: 0
my own repr: >>>['First!', 'FooBar', 'Foo', 'Bar', 1, 2, 3]<<<
--------------------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 33, in <module>
    l.test()
  File "test.py", line 20, in test
    for item in list:
TypeError: 'type' object is not iterable
Wie komme ich in test() an die Daten der Liste? Natürlich könnte ich die Schleife mit list.__iter__(self) machen. Aber wo steck die liste als object?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Montag 21. Juli 2008, 12:22

Code: Alles auswählen

>>> class MyList(list):
...     def test(self):
...         for item in self:
...             print item
...
>>>
>>> foo = MyList([1,2,3,4])
>>> foo.test()
1
2
3
4

Und wenn du Methoden überschreibst kannst du super() benutzen um auf die Methoden der ursprünglichen Klasse zuzugreifen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 21. Juli 2008, 12:24

jens hat geschrieben:Aber wo steck die liste als object?
Schon mal ``self`` ausprobiert?

Code: Alles auswählen

>>> class mylist(list):
...     def test(self):
...         for item in self:
...             print item
Jens, dein Beispiel finde ich irgendwie wenig list-spezifisch. Es ist doch logisch, dass wenn man in Child-Klassen Methoden des Parents überschreiben will, diese Funktionen auch gleich benennen muss. Wie man Eltern-Methoden in den Child-Methoden aufruft verläuft auch nach den üblichen Regeln, wie auch in allen anderen Klassen Parent-Methoden aufgerufen werden. Ich sehe hier nichts ``list``-spezifisches.

Noch dazu veraltete ``UserList`` und ``UserDict`` Module vorzustellen halte ich für blödsinnig, da diese seitdem man von in C implementierten Datentypen erben kann, nicht mehr nötig sind. Sind auch beide nicht mehr in Python 3.0 vorhanden.
Zuletzt geändert von Leonidas am Montag 21. Juli 2008, 12:29, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. Juli 2008, 12:24

@BlackVivi: Ah, natürlich. Genau das meinte ich...

OK, also dann gibt es keine Anleitung in der Offiziellen Doku?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Montag 21. Juli 2008, 12:26

jens hat geschrieben:@BlackVivi: Ah, natürlich. Genau das meinte ich...

OK, also dann gibt es keine Anleitung in der Offiziellen Doku?
Naja, wenn du Vererbung beherrscht brauchst du wohl keine. Du brauchst nur die Implementierung von list zu kennen und die steht ja in'r Doku. Gibt auch nix spezielles daran... Das ist ja grade das tolle davon zu erben.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. Juli 2008, 12:27

BlackVivi hat geschrieben:Du brauchst nur die Implementierung von list zu kennen und die steht ja in'r Doku.
Wo?

IMHO ist ein Beispiel viel schneller zu begreifen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Montag 21. Juli 2008, 12:31

http://docs.python.org/tut/node7.html#S ... 0000000000

Da, oder?... Da steht wie jede Methode funktioniert, viel mehr brauchst du ja nicht zu wissen. Ansonsten schaust du einfach in'n Quelltext, aber das halte ich für keine gute Idee... es kommt halt drauf an was du machen willst. Ich sehe kein Problem darin, Methoden zu überschreiben wenn sie mehr machen sollen, als in der Standardimplementierung, oder?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. Juli 2008, 12:32

Naja, ok die Info hätte mir aber vorhin nicht weiter geholfen... OK, ich mache später eine Wiki Seite dazu...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 21. Juli 2008, 12:33

jens hat geschrieben:
BlackVivi hat geschrieben:Du brauchst nur die Implementierung von list zu kennen und die steht ja in'r Doku.
Wo?
``help(list)``
jens hat geschrieben:IMHO ist ein Beispiel viel schneller zu begreifen...
Das ist ein allgemeines Beispiel von vererbung. Genausogut kann man auch von ``object`` erben. Ich sehe also nicht wo so ein Beispiel irgendwelchen zusätzlichen Gewinn bringt.

Jens, du willst doch nicht sagen, dass das Beispiel was du da gezeigt hast, irgendetwas ist wo man nicht selbst drauf kommen könnte? Sowas wird hier auch eigentlich im Forum nie gefragt, scheint also auch kein Problem zu sein. Keine Ahnung warum du das jetzt als Problem ansiehst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. Juli 2008, 12:35

:roll:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 29. Juli 2008, 10:02

So, hab zwei Wiki Seiten angelegt:

[wiki]Tutorial/von list erben[/wiki]
[wiki]Tutorial/von dict erben[/wiki]

Dabei ist mir noch eine Frage eingefallen: Worin liegt der Unterschied ob ich eine geerbte dict/list Methode mit super() anspreche, oder direkt per list/dict?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 29. Juli 2008, 10:44

jens hat geschrieben:Worin liegt der Unterschied ob ich eine geerbte dict/list Methode mit super() anspreche, oder direkt per list/dict?
Das super() etwas mehr macht als ein direkter aufruf, siehe The truth about super().
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 30. Juli 2008, 12:01

War die Wiki-Seite jetzt wirklich nötig? Ist doch irgendwie Basiswissen über Vererbung oder?
TUFKAB – the user formerly known as blackbird
Antworten