11 Stimmen

Gibt es in Python Konvertierungsoperatoren?

Ich glaube nicht, aber ich dachte, ich frage vorsichtshalber mal nach. Zum Beispiel für die Verwendung in einer Klasse, die eine int kapselt:

i = IntContainer(3)
i + 5

Und ich bin nicht nur in diesem int Beispiel interessiert, ich war für etwas sauber und allgemein, nicht überschreiben jede int und String-Methode suchen.

Danke, sunqiang. Das ist genau das, was ich wollte. Mir war nicht klar, dass man diese unveränderlichen Typen unterklassifizieren kann (ich komme von C++).

class IntContainer(int):
    def __init__(self,i):
        #do stuff here
        self.f = 4

    def MultiplyBy4(self):
        #some member function
        self *= self.f
        return self

print 3+IntContainer(3).MultiplyBy4()

13voto

ars Punkte 112843

Das sollte genügen:

class IntContainer(object):
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        # do some type checking on other
        return self.x + other

    def __radd__(self, other):
        # do some type checking on other
        return self.x + other

出力します。

In [6]: IntContainer(3) + 6
Out[6]: 9

In [7]: 6 + IntContainer(3)
Out[7]: 9

Für weitere Informationen suchen Sie nach "radd" in den folgenden Dokumenten:

Es gibt noch weitere solche Methoden für die "richtige Addition", "richtige Subtraktion", usw.

Hier ist ein weiterer Link zu denselben Betreibern:

Übrigens hat Python auch Casting-Operatoren:

Aber sie werden nicht erreichen, was Sie in Ihrem Beispiel brauchen (im Grunde, weil Methoden keine Typ-Annotation für Parameter haben, so gibt es keine gute Möglichkeit, implizit zu casten). Also können Sie dies tun:

class IntContainer2(object):
    def __init__(self, x):
        self.x = x

    def __int__(self):
        return self.x

ic = IntContainer2(3)
print int(ic) + 6
print 6 + int(ic)

Aber das wird scheitern:

print ic + 6  # error: no implicit coercion

5voto

liori Punkte 38648

Es gibt keine Konvertierungsoperatoren wie in C++, da Python nicht über diese Art von starkem statischem Typsystem verfügt. Die einzigen automatischen Konvertierungsoperatoren sind diejenigen, die numerische Standardwerte behandeln (int/float); sie sind in der Sprache vordefiniert und können nicht geändert werden.

Die "Typumwandlung" erfolgt in der Regel durch Konstruktoren/Faktoren. Sie können dann Standardmethoden überladen wie __add__ damit es mehr wie andere Klassen funktioniert.

3voto

del-boy Punkte 3456

Ist es das, was Sie brauchen?

In [1]: class IntContainer(object):
   ...:     def __init__(self, val):
   ...:         self.val = val
   ...:     def __add__(self, val):
   ...:         return self.val + val
   ...:     def __radd__(self, val):
   ...:         return self.val + val
   ...:
   ...:

In [2]: i = IntContainer(3)

In [3]: i + 5
Out[3]: 8

In [4]:

3voto

sunqiang Punkte 6274

Manchmal reicht es vielleicht aus, direkt von int zu subclassen. dann __add__ y __radd__ brauchen keine Kostüme.

class IntContainer(int):
    pass
i = IntContainer(3)
print i + 5 # 8 
print 4 + i # 7

class StrContainer(str):
    pass
s = StrContainer(3)
print s + '5' # 35
print '4' + s # 43

2voto

ayce Punkte 21

Entschuldigung, dass ich 8,5 Jahre zu spät zur Party komme. Sie können von einem unveränderlichen (z. B. int) ableiten. Sie können nicht definieren __init__ denn die unveränderliche Datei ist bereits erstellt und kann (per Definition) nicht mehr geändert werden. Dies ist, wo __new__ ist sehr nützlich.

class IntContainer(int):
   def __new__ (cls, val):
      ival = int.__new__(cls, val)
      ival._rval = 'IntContainer(%d)' % ival
      return ival
   def __repr__ (self):
      return self._rval

In [1]: i = IntContainer(3)

In [2]: i
Out[2]: IntContainer(3)

In [3]: repr(i)
Out[3]: 'IntContainer(3)'

In [4]: str(i)
Out[4]: '3'

In [5]: i + 5
Out[5]: 8

In [6]: 4 + i
Out[6]: 7

In [7]: int(i)
Out[7]: 3

In [8]: float(i)
Out[8]: 3.0

Um nun Ihre Frage zu den Konvertierungsoperatoren zu beantworten. Sie können auch definieren __int__ , __long__ , __float__ und natürlich, __str__ . Um ein beliebiges Objekt zu konvertieren oder in ein beliebiges Objekt umzuwandeln, müssen Sie höchstwahrscheinlich das andere Objekt ändern, um das Gewünschte zu erhalten. Sie können die __new__ Methode dieses anderen Objekts. Oder wenn das andere Objekt bereits erstellt wurde, versuchen Sie es mit __call__ .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X