Erweiterung der Tuple-Funktionalität

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.
Antworten
Benutzername
User
Beiträge: 1
Registriert: Freitag 13. April 2012, 07:48

Liebe Pythonphile,
zu Lernzwecken möchte ich gerne die Funktionalität des Tuple-Typs erweitern. Das heißt, dass ich z.B. eine append(element)-Funktion einführen möchte, die mir das (bzw. ein neues) Tuple wieder um ein Element erweitert zurück gibt.
Dazu hatte ich zwei Ansätze:
Mein bevorzugten Ansatz war, ein Objekt zu erzeugen, in dem einfach ein Tupel als Attribut gespeichert wird. Wenn das Objekt irgendwo verwendet wird, sollte dann allerdings direkt dieses Attribut verwendet werden. Der Trivialansatz wäre dann etwas in dieser Art:

Code: Alles auswählen

class KindOfTuple():
    def __init__(self, elements):
        self.t=tuple(elements)
    def append(self, element):
        self.t=self.t+(element,)

test=KindOfTuple((1,2,3))
test.append(4)
print(test)
Die Ausgabe sollte dann "(1,2,3,4)" sein (was es natürlich momentan nicht ist). Gibt es eine Möglichkeit, dies zu erreichen?
Alternativ könnte ich einfach vom Tuple erben:

Code: Alles auswählen

class KindOfTuple(tuple):
    def __new__(cls, *args, **kw):
        return tuple.__new__(cls, *args, **kw)
Hier ist mir aber vollkommen unklar, wie ich jetzt einen append-Befehl implementieren könnte. Hat vielleicht jemand dazu eine Idee?

Vielen Dank
Jan
P.S. Dass dieses Projekt keinen praktischen Zweck hat, da die meisten Funktionen bereits im list-Typ implementiert sind, ist mir klar! Der Weg ist das Ziel.
BlackJack

@Benutzername: Die Darstellung eines Objektes als Zeichenkette wird über die Methoden `__str__()` und `__repr__()` geregelt, wobei `object.__str__()` auf `__repr__()` zurück greift. Wenn man `__repr__()` implementiert hat man deshalb beides gleich.

Wenn Du Deinen Tupel-Typ komplett selbst implementierst, dann musst Du noch einiges mehr implementieren, damit es als Tupel-Ersatz verwendet werden kann. Zum Beispiel Hash-Wert und Vergleichsoperationen, damit man es als Schlüssel in Wörterbüchern oder als Element in Mengen verwenden kann.

Letztendlich musst Du immer alle Methoden vom Tupel neu implementieren, die ein Tupel zurück geben, denn Du musst ja sicherstellen, dass dieser Rückgabewert von Deinem Typ ist und nicht zu einem normalen Tupel wird.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

class MyTuple(tuple):
    def __add__(self, other):
        return MyTuple(tuple.__add__(self, other))
    def append(self, elem):
        return self + (elem,)
Antworten