2010-09-29 11 views
11

Ich überlege, den +-Operator für eine bestimmte Zeichenfolge zu überladen, also dachte ich daran, die String-Klasse zu untergliedern und dann den Code in der neuen Klasse hinzuzufügen. Allerdings wollte ich mir zuerst die Standard-String-Klasse ansehen, aber ich kann es nicht finden ... blöd wie?Position der Python-String-Klasse im Quellcode

Kann mir jemand den Weg weisen? Auch Online-Dokumentation des Quellcodes.

+0

Es C Extention sein können, und builtin Art so denke ich, es ist nicht möglich, den Code als .py-Datei zu öffnen, was Sie denken. .. – shahjapan

+0

"Ich überlege, den '+' Operator für eine bestimmte Zeichenfolge zu überladen". "Überladen" für "eine bestimmte Zeichenfolge" ist unter keinen Umständen sinnvoll. Sie möchten wahrscheinlich eine neue Klasse von Objekten, die gut mit Strings spielen. Sie sollten mehr Informationen zur Verfügung stellen, da das, was Sie beschreiben, nicht viel Sinn ergibt. –

+0

Nun, der spezielle Fall ist die Überladung der Zeichenfolge, so dass, wenn ich die __add__ -Methode mit einem numerischen Typ (int, float, etc) hinzufügen, wird es auf den entsprechenden Buchstaben "inkrementieren". z.B. 'A' + 2 = 'C'. Da ich jedoch noch nie eine Überladung durchgeführt habe, interessiert mich auch, wie Operatoren im allgemeinen Sinne überlastet sind, nicht nur in dieser speziellen Situation. – momo

Antwort

6

Es ist dokumentiert here. Die Hauptimplementierung ist in Objects/stringobject.c. Subklassieren str ist wahrscheinlich nicht das, was Sie wollen. Ich würde hier eher Komposition bevorzugen; habe ein Objekt mit einem String-Feld und einem speziellen Verhalten.

+1

Link ist jetzt tot. Siehe https://svn.python.org/projects/python/trunk/Objects/stringobject.c –

+0

Und ... Link ist wieder tot. Ich denke, der Quellcode befindet sich jetzt auf Github in ['Objects/unicodeobject.c'] (https://github.com/python/cpython/blob/master/Objects/unicodeobject.c). – Delgan

0

Sie könnten dies meinen.

class MyCharacter(object): 
    def __init__(self, aString): 
     self.value= ord(aString[0]) 
    def __add__(self, other): 
     return MyCharacter(chr(self.value + other)) 
    def __str__(self): 
     return chr(self.value) 

Es funktioniert so.

>>> c= MyCharacter("ABC") 
>>> str(c+2) 
'C' 
>>> str(c+3) 
'D' 
>>> c= c+1 
>>> str(c) 
'B' 
0

meine Implementierung ist ähnlich, wenn auch nicht so ordentlich:

class MyClass: 
    def __init__(self, name): 
     self.name = name 
    def __add__(self, other): 
     for x in range(1, len(self.name)): 
      a = list(self.name)[-1 * x] 
      return self.name[:len(self.name)-x] + chr(ord(a) + other) 


>>> CAA = MyClass('CAA') 
>>> CAA + 1 
'CAB' 
>>> CAA + 2 
'CAC' 
>>> CAA + 15 
'CAP' 
+0

"nicht so ordentlich"? Es hat komische, seltsame Probleme. Warum gibt es einen "Return" in der Mitte der For-Schleife? Das wird die "Schleife" genau einmal ausführen und stoppen. Es gibt keine wirkliche "Schleife". Dies kann erheblich vereinfacht werden. –

+0

Wenn Sie Python 3 nicht verwenden, machen Sie es bitte zu einer Unterklasse von 'object'. –

Verwandte Themen