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
Links
- Listen:
Python Tutorial 'More on Lists' (en)
Der Quellentext UserList.py zeigt alle vorhendenen list Methoden und wie diese funktionieren.
- Allgemein
Python Reference 'Special method names' (en)
Blog Artikel 'Python __Underscore__ Methods' (en)