Seite 1 von 2

Python Doku: von list / dict erben...

Verfasst: Montag 21. Juli 2008, 12:00
von jens
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?

Verfasst: Montag 21. Juli 2008, 12:06
von Leonidas
Ähm, was sind denn deine Schwierigkeiten mit ``list`` und ``dict``? Im Allgemeinen erbt man davon so ab, wie von allem anderen auch.

Verfasst: Montag 21. Juli 2008, 12:14
von jens
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?

Verfasst: Montag 21. Juli 2008, 12:22
von BlackVivi

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.

Verfasst: Montag 21. Juli 2008, 12:24
von Leonidas
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.

Verfasst: Montag 21. Juli 2008, 12:24
von jens
@BlackVivi: Ah, natürlich. Genau das meinte ich...

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

Verfasst: Montag 21. Juli 2008, 12:26
von BlackVivi
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.

Verfasst: Montag 21. Juli 2008, 12:27
von jens
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...

Verfasst: Montag 21. Juli 2008, 12:31
von BlackVivi
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?

Verfasst: Montag 21. Juli 2008, 12:32
von jens
Naja, ok die Info hätte mir aber vorhin nicht weiter geholfen... OK, ich mache später eine Wiki Seite dazu...

Verfasst: Montag 21. Juli 2008, 12:33
von Leonidas
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.

Verfasst: Montag 21. Juli 2008, 12:35
von jens
:roll:

Verfasst: Dienstag 29. Juli 2008, 10:02
von jens
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?

Verfasst: Dienstag 29. Juli 2008, 10:44
von Leonidas
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().

Verfasst: Mittwoch 30. Juli 2008, 12:01
von mitsuhiko
War die Wiki-Seite jetzt wirklich nötig? Ist doch irgendwie Basiswissen über Vererbung oder?

Verfasst: Mittwoch 30. Juli 2008, 13:07
von jens
Und? Wo steht denn sonst so ein Beispiel?

Verfasst: Mittwoch 30. Juli 2008, 14:49
von Leonidas
jens hat geschrieben:Und? Wo steht denn sonst so ein Beispiel?
Python Tutorial, jedes Python-Buch.

Verfasst: Mittwoch 30. Juli 2008, 14:53
von jens
Eingangs hatte ich gefragt, ob jemand eine Webseite nennen kann wo sowas steht. Brauchbare Treffer gab es nicht.
Also hab ich das mal kurz und knapp in's Wiki geschrieben. Das war nun falsch? :roll:

...motiviert mich jetzt tierisch, mehr im Wiki zu schreiben...

Verfasst: Mittwoch 30. Juli 2008, 15:08
von Leonidas
jens hat geschrieben:Eingangs hatte ich gefragt, ob jemand eine Webseite nennen kann wo sowas steht. Brauchbare Treffer gab es nicht.
9. Classes zählt nicht?
jens hat geschrieben:...motiviert mich jetzt tierisch, mehr im Wiki zu schreiben...
Naja, es geht ja nicht darum dass du etwas geschrieben hast, das ist ja schön und gut, sondern dass du etwas geschrieben hast was nicht notwendig war. Stattdessen hättest du etwa [wiki]Module[/wiki] oder [wiki]Neue Features[/wiki] um Punkte, Beschreibungen und Absätze erweitern können.

Verfasst: Mittwoch 30. Juli 2008, 15:12
von jens
Leonidas hat geschrieben:9. Classes zählt nicht?
Das ist ehr allgemein über vererben. Schön und gut, aber es erklärt IMHO nicht so einfach, wie ich von list oder dict Sinnvoll erben kann. Ein Blick auf die Beispiele die ich in's Wiki gestellt habe tun genau das.