2009-05-04 18 views
6

Ich möchte eine Zeichenfolge mit einem zusätzlichen Attribut, sagen wir, ob es in rot oder grün drucken soll.Wie bekomme ich String-Ness in meiner Klasse?

Subclassing (str) funktioniert nicht, da es unveränderlich ist. Ich sehe den Wert, aber es kann nervig sein.

Kann mehrere Erbschaft helfen? Ich habe das nie benutzt.

Vererben nur Objekt und mit self.value = str bedeutet, ich muss alle String-Ness-Nachrichten (wie Streifen) selbst implementieren.

Oder gibt es eine Möglichkeit, sie weiterzuleiten, wie Rubys missing_method?

Ich denke, die Verwendung eines Class-level-Wörterbuchs, das von der Instanz indiziert wird, um die Farbe zu speichern, könnte funktionieren. Zu hässlich?

Antwort

6

str vererbt werden können, wenn Sie eine sehr alte Python-Version verwenden, zum Beispiel:

>>> class A(str): 
... def __new__(cls, color, *args, **kwargs): 
...  newobj = str.__new__(cls, *args, **kwargs) 
...  newobj.color = color 
...  return newobj 
>>> a = A("#fff", "horse") 
>>> a.color 
'#fff' 
>>> a 
'horse' 
>>> a.startswith("h") 
True 
+3

Das ist gut. Aber Sie müssen mit diesem Ansatz vorsichtig sein. Wenn Sie eine String-Operation wie (title(), +, ...) gemacht haben, wird das Ergebnis vom Typ str nicht sein. –

+0

Ich hatte den Eindruck, dass genau das NICHT funktionieren würde, daher die Frage. Es stellte sich heraus, dass es ein Programmierfehler in meinem __new__ war und ich Fehlinterpretation von Pythons unangemessener Nachricht. – Tobias

2

Vielleicht eine benutzerdefinierte Klasse, die enthält eine Zeichenfolge wäre ein besserer Ansatz. Müssen Sie wirklich alle String-Methoden an die zugrunde liegende Zeichenfolge übergeben? Warum sollte man die Zeichenkette nicht über eine Eigenschaft offen legen und es den Konsumenten der Klasse erlauben, das zu tun, was sie wollen?

0

Sie benötigen alle Methoden der Zeichenkette, also verlängern Sie die Zeichenkette und fügen Sie Ihre zusätzlichen Details hinzu. Was ist, wenn String unveränderlich ist? Mach einfach deine Klasse auch unveränderlich. Dann erstellst du sowieso neue Objekte, damit du nicht versehentlich versuchst zu denken, dass es ein veränderbares Objekt ist.

Oder, wenn Python einen hat, eine veränderbare Variante von string erweitern. Ich kenne Python nicht genug, um zu wissen, ob eine solche Struktur existiert.

2
import UserString 
class mystr(UserString.MutableString): 
    ... 

Es ist im Allgemeinen am besten unveränderlichen Strings & Subklassen davon zu verwenden, aber wenn Sie ein veränderliches man diese ist der einfachste Weg, um es zu bekommen.

+0

Dies ist veraltet seit Python 2.2 –

+0

Die UserString-Klasse war in 2.2 veraltet, aber die MutableString-Klasse wurde nur in 2.6 veraltet - siehe http://docs.python.org/library/userdict.html - wenn Sie sicher sind Wenn Sie 2.6 oder höher verwenden, kann eine veränderbare Zeichenfolge über den neuen Bytearray-Typ implementiert werden (veränderbares Array von Bytes) –

0

Sie könnten versuchen, das stringlike Modul in PyPI zu verwenden. Hier ist an example.

Verwandte Themen