2017-12-02 4 views
0

Ich arbeite an einem kleinen Projekt, wo ich Methode Überladung für mul Methode verwenden muss. Aber das mul Methode hat eine andere Argumente.Methode Überladung funktioniert nicht, wenn Argumente unterschiedlich sind

Methode kann 2 Argument nehmen 1. ist selbst und 2. ist entweder Instanz oder Integer. Also, wenn Methode 2. Argument als Instanz nehmen, gibt es mir einen Fehler. Hier ist mein Code

import math 
class Vector: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
    def __mul__(self,v1): 
     x = self.x * v1.x 
     y = self.y * v1.y 
     return Vector(x,y) 

    def __mul__(self,n): 
     x = self.x*n 
     y = self.y*n 
     return Vector(x,y) 


v1 = getVector() 
v2 = getVector() 
v3 = v1 * v2 

v4 = 1 
v5 = getVector() 
v6 = v4 * v5 

Also, wenn ich versuche, das Programm, das ich Fehler bin immer zu laufen, dass

File "Al.py", line 102, in <module> 
    main() 
    File "Al.py", line 88, in main 
    mul() 
    File "Al.py", line 47, in mul 
    v3 = v1 * v2 
    File "Al.py", line 21, in __mul__ 
    x = self.x*n 

Kann mir das zu verstehen jemand helfen? Wie kann ich die überladene Methode aufrufen, ohne meine Methodensignatur zu ändern?

+5

Python nicht Überlastung unterstützen. Schreiben Sie stattdessen eine Methode, in der Sie Parametertyp und Prozessparameter entsprechend überprüfen. –

+0

Welche Python-Version verwenden Sie? Entfernen Sie das falsche Tag. –

+1

Es bezieht sich nicht auf Version. –

Antwort

2

Wie in den Kommentaren erwähnt, unterstützt Python das Überladen von Methoden nicht. Stattdessen müssen Sie die Argumente im Rumpf der Funktion untersuchen, um zu bestimmen, wie vorzugehen ist.

Beachten Sie, dass Sie in der Regel nicht die des Arguments (n) Typ Sie untersuchen, sondern ihr Verhalten . Zum Beispiel

def __mul__(self, other): 
    try: 
     try: 
      x = self.x * other.x 
      y = self.y * other.y 
     except AttributeError: 
      x = self.x * other 
      y = self.y * other 
    except Exception: 
     return NotImplemented 

    return Vector(x, y) 

__rmul__ = __mul__ # Allows 4 * v, not just v * 4 

Das zweite Argument von __mul__ hat nicht nur eine Zahl oder ein Vector zu sein; es kann alles sein, was ähnlich genug ist, um die versuchten Multiplikationen zu erreichen.

Bei allen anderen Fehlern, die die Multiplikation betreffen, geben Sie NotImplemented zurück, damit type(other).__rmul__ ausprobiert werden kann.

Wenn Sie wirklich zwischen Argumenten verschiedenen Typen unterscheiden müssen, verwenden Sie isinstance:

def __mul__(self, other): 
    if isinstance(other, int): 
     x = self.x * other 
     y = self.y * other 
    elif isinstance(other, Vector): 
     x = self.x * other.x 
     y = self.y * other.y 
    else: 
     return NotImplemented 

    return Vector(x, y) 
+0

Im ersten Satz meinst du das Überladen/Überladen von Methoden im Allgemeinen und nicht das Überladen von Operatoren? Ich habe gesehen, dass sich das Überladen von Operatoren auf einfache benutzerdefinierte Dunder-Methoden bezieht, wie zum Beispiel "__mul__" – Tim

+0

Ich meinte, dass die Methode überladen ist; Danke für den Hinweis. – chepner

+1

Gute, klare Erklärung. Vielleicht ist es bemerkenswert, dass ['isinstance()'] (https://docs.python.org/3/library/functions.html#isinstance) mehrere Kandidatentypen in einem Aufruf überprüfen kann, indem ein Tupel als zweiter übergeben wird Argument: zB 'isinstance (other, (int, float))'. – martineau

Verwandte Themen