web-dev-qa-db-ja.com

加算、減算、乗算演算子のオーバーロード

異なる、または同じサイズの2つのベクトルを加算、減算、乗算できるように、加算、減算、乗算演算子をオーバーロードするにはどうすればよいですか?たとえば、ベクトルのサイズが異なる場合、2つのベクトルを最小のベクトルサイズに従って加算、減算、または乗算できる必要がありますか?

さまざまなベクトルを変更できる関数を作成しましたが、今は演算子をオーバーロードするのに苦労しており、どこから始めればよいのかわかりません。以下のコードを貼り付けます。何か案は?

def __add__(self, y):
    self.vector = []
    for j in range(len(self.vector)):
        self.vector.append(self.vector[j] + y.self.vector[j])
    return Vec[self.vector]
18
user3014014

あなたは クラスの__add____sub__、および__mul__ メソッドを定義します。それが方法です。各メソッドは2つのオブジェクト(+/-/*のオペランド)を引数として取り、計算の結果を返すことが期待されています。

26
jwodder

docs 答えがあります。基本的に、追加または複数の場合などにオブジェクトで呼び出される関数があります。たとえば、__add__は通常の追加関数です。

7
cmd

この質問に対する受け入れられた回答に問題はありませんが、これを使用する方法を示すためにいくつかの簡単なスニペットを追加しています。 (メソッドを「オーバーロード」して複数の型を処理することもできます。)


"""Return the difference of another Transaction object, or another 
class object that also has the `val` property."""

class Transaction(object):

    def __init__(self, val):
        self.val = val

    def __sub__(self, other):
        return self.val - other.val


buy = Transaction(10.00)
sell = Transaction(7.00)
print(buy - sell)
# 3.0

"""Return a Transaction object with `val` as the difference of this 
Transaction.val property and another object with a `val` property."""

class Transaction(object):

    def __init__(self, val):
        self.val = val

    def __sub__(self, other):
        return Transaction(self.val - other.val)


buy = Transaction(20.00)
sell = Transaction(5.00)
result = buy - sell
print(result.val)
# 15

"""Return difference of this Transaction.val property and an integer."""

class Transaction(object):

    def __init__(self, val):
        self.val = val

    def __sub__(self, other):
        return self.val - other


buy = Transaction(8.00)
print(buy - 6.00)
# 2
5
binarysubstrate