かけ算演算子の挙動を定義する -- Pythonの特殊メソッド
かけ算に順番が必要?必要ではない?
かけ算に順番が必要である・必要ではない という話が世間では話題になっているようです。
かけ算の5×3と3×5って違うの? - Togetterまとめ
そういえば掛け算にはそんなルールがあったな
Twitterのタイムラインでも上記の話題がこのごろよく流れてくるので、へぇ、そんなことが話題になるんだなぁなどと思っていました。
かけ算がとても趣深いことに気づく
思えばかけ算とはとても趣深いものです。
わたしはこんなことに気がつきました。
かけ算は右辺と左辺に数が来るとは限りませんからね。人が来るときにも対処できるよう乗算演算子を定義しておかないと。
2011-12-28 11:04:31 via web
@imagawa_yakata 右辺と左辺でインターフェイスが違うわけですね。わかります。
2011-12-28 11:06:18 via web to @imagawa_yakata
人に対する operator * を friend 関数として定義するわけですね
そう、かけ算は何も数値の計算だけの為にあるわけではないのです。
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件この記事に言及が入ったので追記しておきます。
一つ目は小宮さん。
@imagawa_yakata 出典に URL を追加すべき。たぶん。
「出典」とは以下のURL。
カップリング (同人) - Wikipedia
もう一つは清水川さん。
@imagawa_yakata む、マジックじゃなくて、スペシャルじゃない?
2011-12-28 15:26:42 via Echofon to @imagawa_yakata
pythonのドキュメントでは「特殊メソッド」という用語が使われているので、訂正しました。