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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ä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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

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

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

:roll:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

War die Wiki-Seite jetzt wirklich nötig? Ist doch irgendwie Basiswissen über Vererbung oder?
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Und? Wo steht denn sonst so ein Beispiel?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Und? Wo steht denn sonst so ein Beispiel?
Python Tutorial, jedes Python-Buch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten