2017-12-02 19 views
0

私はmulメソッドのメソッドオーバーロードを使用する必要がある小さなプロジェクトで作業しています。しかし、mulメソッドには異なる引数があります。引数が異なると、メソッドのオーバーロードが機能しない

メソッドは引数2を取ることができます。第1引数は自己であり、第2引数はインスタンスまたは整数です。 Methodが第2引数をインスタンスとして取ると、エラーが出ます。 は、ここで私は私が

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 

は、誰かが私はこれを理解するのに役立つことができ、エラーを取得していたプログラムを実行しようとしていたときに

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 

だから私のコードですか?メソッドのシグネチャを変更せずに、オーバーロードされたメソッドを呼び出すにはどうすればよいですか?

+5

Pythonがオーバーロードをサポートしていません。代わりに、パラメータタイプとプロセスパラメータをそれに応じてチェックする1つのメソッドを記述します。 –

+0

どのPythonバージョンを使用していますか?間違ったタグを削除してください。 –

+1

バージョンには関係ありません。 –

答えて

2

コメントに記載されているとおり、Pythonはメソッドのオーバーロードをサポートしていません。代わりに、どのように処理するかを決定するためには、関数本体の引数を調べなければなりません。

あなたは、一般的に、引数(複数可)のタイプを検討していないノートではなく、彼らの行動。例えば、

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 

__mul__の第2引数は、わずか数又はVectorである必要はありません。成功しようとする乗算の​​いずれかに似ているものであれば、どれでもかまいません。

乗算に関連するその他のエラーでは、を返して、type(other).__rmul__を試すことができます。

あなたが本当に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

最初の文章では、演算子のオーバーロードではなく、メソッドのオーバーロード/オーバーロードを一般的に意味しますか?私はオペレータのオーバーロードが '__mul__'のような単純なカスタムダンダーメソッドを参照しているのを見てきました – Tim

+0

私はメソッドのオーバーロードを意味しました。それを指摘してくれてありがとう。 – chepner

+1

よく分かりやすい説明。 ['isinstance()'](https://docs.python.org/3/library/functions.html#isinstance)は、1つの呼び出しで複数の候補タイプをチェックすることができます。それらのタプルを2番目の呼び出しとして渡すことができます引数:isinstance(other、(int、float))です。 – martineau

関連する問題