Tutorial
von list erben

Manchmal möchte man Daten in einer Art Liste speichern, die allerdings ein paar zusätzliche Methoden hat.

Der einfachste Weg: Man definiert ein paar Funktionen und nutzt eine einfache Liste die übergeben wird. Eine andere Variante ist eine eigene list-Klasse zu erstellen und dort die benötigten Methoden unterzubringen.

Damit man nicht das Rad neu erfinden muß, kann man von list erben und erhält so alle Funktionalität einer Liste. Am einfachsten sieht man das in einem Beispiel:

   1 # -*- coding: utf-8 -*-
   2 
   3 class MeineListe(list):
   4     def __init__(self, *args, **kwargs):
   5         """
   6         Die ursprüngliche Methode kann man über super() ansprechen. Allerdings
   7         hat das den Nachteil, das man den verwendeten Klassennamen einfügen
   8         muss. Wenn man die Klasse umbenennt muß man alle super()-Aufrufe
   9         abändern.
  10         """
  11         print "init..."
  12         super(MeineListe, self).__init__(*args, **kwargs)
  13 
  14     def append(self, item):
  15         """
  16         Ohne super() kann man die geerbte Method über das 'list' Objekt
  17         ansprechen.
  18         """
  19         print "Hänge '%s' an Liste" % item
  20         list.append(self, item)
  21 
  22     def extend(self, items):
  23         """
  24         Man kann natürlich auch einfach eine Methode komplett selber nachbauen.
  25         Damit es Sinn macht, verändern wir den Wert in diesem Beispiel.
  26         """
  27         print "Liste %s per Hand anfügen mit self.append()" % items
  28         for item in items:
  29             self.append("|%s|" % item)
  30 
  31     def reverse(self):
  32         """
  33         Wenn man versehendlich die geerbte Methode falsch anspricht, entsteht
  34         ein ungewollter Loop, weil nicht die ursprüngliche Methode, sondern die
  35         eigene genutzt wird.
  36         """
  37         print "Alles umdrehen"
  38         # Falsch:
  39         #self.reverse() # RuntimeError: maximum recursion depth exceeded
  40 
  41         list.reverse(self) # richtig
  42 
  43     def alle_zahlen(self):
  44         """
  45         Hier definieren wir mal eine komplett eigene Methode. Dabei wird direkt
  46         auf die Liste die in "self" steckt zugegriffen.
  47         """
  48         print "Liefert alle Zahlen der Liste zurück"
  49         return [item for item in self if isinstance(item, (int, float))]
  50 
  51 
  52 l = MeineListe([1,2,3])
  53 print l # [1, 2, 3]
  54 
  55 print "-" * 79
  56 
  57 l.append("a")
  58 print l # [1, 2, 3, 'a']
  59 
  60 print "-" * 79
  61 
  62 l.extend(["b","c"])
  63 print l # [1, 2, 3, 'a', '|b|', '|c|']
  64 
  65 print "-" * 79
  66 
  67 l.reverse()
  68 print l # ['c', 'b', 'a', 3, 2, 1]
  69 
  70 print "-" * 79
  71 
  72 print l.alle_zahlen() # [1, 2, 3]

Ausgaben:

init...
[1, 2, 3]
-------------------------------------------------------------------------------
Hänge 'a' an Liste
[1, 2, 3, 'a']
-------------------------------------------------------------------------------
Liste ['b', 'c'] per Hand anfügen mit self.append()
Hänge '|b|' an Liste
Hänge '|c|' an Liste
[1, 2, 3, 'a', '|b|', '|c|']
-------------------------------------------------------------------------------
Alles umdrehen
['|c|', '|b|', 'a', 3, 2, 1]
-------------------------------------------------------------------------------
Liefert alle Zahlen der Liste zurück
[3, 2, 1]

siehe auch

Tutorial/von list erben (last edited 2009-06-17 16:14:29 by localhost)