JensDiemer

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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- coding: utf-8 -*-

class MeineListe(list):
    def __init__(self, *args, **kwargs):
        """
        Die ursprüngliche Methode kann man über super() ansprechen. Allerdings
        hat das den Nachteil, das man den verwendeten Klassennamen einfügen
        muss. Wenn man die Klasse umbenennt muß man alle super()-Aufrufe
        abändern.
        """
        print "init..."
        super(MeineListe, self).__init__(*args, **kwargs)

    def append(self, item):
        """
        Ohne super() kann man die geerbte Method über das 'list' Objekt
        ansprechen.
        """
        print "Hänge '%s' an Liste" % item
        list.append(self, item)

    def extend(self, items):
        """
        Man kann natürlich auch einfach eine Methode komplett selber nachbauen.
        Damit es Sinn macht, verändern wir den Wert in diesem Beispiel.
        """
        print "Liste %s per Hand anfügen mit self.append()" % items
        for item in items:
            self.append("|%s|" % item)

    def reverse(self):
        """
        Wenn man versehendlich die geerbte Methode falsch anspricht, entsteht
        ein ungewollter Loop, weil nicht die ursprüngliche Methode, sondern die
        eigene genutzt wird.
        """
        print "Alles umdrehen"
        # Falsch:
        #self.reverse() # RuntimeError: maximum recursion depth exceeded

        list.reverse(self) # richtig

    def alle_zahlen(self):
        """
        Hier definieren wir mal eine komplett eigene Methode. Dabei wird direkt
        auf die Liste die in "self" steckt zugegriffen.
        """
        print "Liefert alle Zahlen der Liste zurück"
        return [item for item in self if isinstance(item, (int, float))]


l = MeineListe([1,2,3])
print l # [1, 2, 3]

print "-" * 79

l.append("a")
print l # [1, 2, 3, 'a']

print "-" * 79

l.extend(["b","c"])
print l # [1, 2, 3, 'a', '|b|', '|c|']

print "-" * 79

l.reverse()
print l # ['c', 'b', 'a', 3, 2, 1]

print "-" * 79

print l.alle_zahlen() # [1, 2, 3]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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]