今川館

都内勤務の地味OLです

かけ算演算子の挙動を定義する -- Pythonの特殊メソッド

かけ算に順番が必要?必要ではない?

かけ算に順番が必要である・必要ではない という話が世間では話題になっているようです。

かけ算の5×3と3×5って違うの? - Togetterまとめ
そういえば掛け算にはそんなルールがあったな

Twitterのタイムラインでも上記の話題がこのごろよく流れてくるので、へぇ、そんなことが話題になるんだなぁなどと思っていました。

かけ算がとても趣深いことに気づく

思えばかけ算とはとても趣深いものです。
わたしはこんなことに気がつきました。

そう、かけ算は何も数値の計算だけの為にあるわけではないのです。
pythonだって

>>> "py" * 2
'pypy'

こんな風に、文字列が来てもかけ算の演算子が動くではありませんか。

人間をかけ算してみよう

pythonは算術演算子に対応する特殊メソッドがあって、これらを定義すれば任意のオブジェクトもかけ算演算子に対応できます。
かけ算の場合、 __mul__, __rmul__ メソッドを定義します。

今回は人間をかけ算したいので、Personというクラスにこれらのメソッドを定義しましょう。

# -*- coding: utf-8 -*- 


BROKEN_HEART = "鬱"


class Person(object):
    def __mul__(self, other):
        if not isinstance(other, Person):
            return BROKEN_HEART
        return "♥♥"

    def __rmul__(self, other):
        if not isinstance(other, Person):
            return BROKEN_HEART
        return None


def main():
    drillbits, pasberth = Person(), Person()
    print(drillbits * pasberth)
    feiz = Person()
    print(feiz * None)
    print(0 * feiz)


if __name__ == "__main__":
    main()

__rmul__ は右辺がPersonになったとき(=左側にPersonでないものがきたとき)に対処できます。


実行結果

♥♥

鬱

鬱

こんな感じです。

追記

2件この記事に言及が入ったので追記しておきます。
一つ目は小宮さん。

「出典」とは以下のURL。
カップリング (同人) - Wikipedia

もう一つは清水川さん。

こちらは「特殊メソッド」という方が正式名称のようです。
しかしぐぐると「マジックメソッド」という語でも引っかかるので現在お調べ中です。
pythonのドキュメントでは「特殊メソッド」という用語が使われているので、訂正しました。