14

Ich habe eine Vektorklasse und ich definierte die __mul__ Methode, um einen Vektor mit einer Zahl zu multiplizieren. HierDefinieren Sie Methoden-Aliase in Python?

ist die __mul__ Methode:

def __mul__(self, other): 
    x = self.x * other 
    y = self.y * other 
    new = Vector() 
    new.set_pos((x, y)) 
    return new 

Mein Problem ist, dass ich weiß nicht, welche die zwischen der Zahl und dem Vektor ist. Wenn self die Nummer ist, löst self.x einen Fehler aus. (Ich bin vielleicht in diesem Punkt zu verkennen: Ist „andere“ immer eine Zahl)

So fand ich hier: Python: multiplication override , dass ich tun konnte:

__rmul__ = __mul__ 

aber wie kann ich tun, dass in einem Klassendefinition?

Etwas wie:

def __rmul__ = __mul__ 

Antwort

18

self wird nie die Zahl in __mul__() sein, da das Objekt das Verfahren angebracht ist, nicht die Zahl ist, ist es der Vektor ist, und per Definition ist es der Multiplikand.

other wird eine Zahl sein, wenn Ihr Objekt mit einer Zahl multipliziert wird. Oder es könnte etwas anderes sein, wie ein anderer Vektor, den Sie testen und handhaben könnten.

Wenn Ihr Objekt der Multiplikator ist, wird aufgerufen, wenn der Multiplikand nicht weiß, wie er mit der Operation umgehen soll.

Um den Fall zu behandeln, in dem __mul__ und __rmul__ sollten die gleiche Methode sein, da die Operation kommutativ ist, können Sie einfach die Zuordnung in Ihrer Klassendefinition tun.

class Vector(object): 
    def __mul__(self, other): 
     pass 

    __rmul__ = __mul__ 
9

Einfach geben Sie es als Attribut:

__rmul__ = __mul__ 

Dies ist die gleiche Art und Weise Sie einen Aliasnamen einer Funktion in einem Modul schaffen würde; Das Erstellen eines Alias ​​einer Methode innerhalb eines Klassenkörpers funktioniert genauso.

3

Der Punkt ist, dass Sie in Python Objekte sagen können, wie sie sich durch Dinge multiplizieren. Das bedeutet, dass

a * b 

könnte entweder bedeuten, „a sagen, sich zu vermehren durch b“ oder „sagen b selbst zu multiplizieren mit a“. Im Code übersetzt, das zu

a.__mul__(b) 

oder

b.__rmul__(a) 
+0

Gibt es eine Möglichkeit zu wissen, welcher man genannt wird? –

+1

'__mul__' zuerst, dann' __rulul__' wenn das fehlschlägt. – katrielalex

+3

besser: oder "sag b, um ein selbst zu multiplizieren (b)". Der Multiplikationsoperator muss nicht kommutativ sein. – glglgl

Verwandte Themen