2012年12月22日土曜日

開発環境

『初めてのPython 第3版』(Mark Lutz 著、夏目 大 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-393-7) のVI部(オブジェクト指向プログラミング)23章(クラスのコーディング(基礎))の練習問題6、7、8を解いてみる。

その他参考書籍

6, 7, 8.

オーバーロードの方法は各演算子に対応するフックメソッドをクラスで上書きすればいい。目的は、クラスにビルトインオブジェクトと同じように、自然な(あるいは自分自身の目的)演算子を導入するため。__init__(コンストラクタ)がもっとも演算子のオーバーロードに使用されるメソッド。(大体のクラスで初期化の際にデータのやり取りをするから。

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

class MyInt(int):
    def __init__(self, data): # コンストラクタのオーバーロード
        self.data = data
    
    def __add__(self, other): # 演算子「+」のオーバーロード
        print("「+」のオーバーロード! ({0} + {1} = {2})".format(
          self, other, self.data + other))    

    def __sub__(self, other): # 演算子「-」のオーバーロード
        print("「-」のオーバーロード! ({0} / {1} = {2})".format(
          self, other, self.data - other))

    def __mul__(self, other): # 演算子「*」のオーバーロード
        print("「+」のオーバーロード! ({0} * {1} = {2})".format(
          self, other, self.data * other))

    def __floordiv__(self, other): # 演算子「//」のオーバーロード
        print("「//」のオーバーロード! ({0} // {1} = {2})".format(
          self, other, self.data // other))
    
    def __truediv__(self, other): # 演算子 「/」オーバーロード
        print("「/」のオーバーロード! ({0} / {1} = {2})".format(
          self, other, self.data / other))
    
    def __mod__(self, other): # 演算子「%(モジュロ)」のオーバーロード
        print("「%」のオーバーロード! ({0} % {1} = {2})".format(
          self, other, self.data % other))

    def __repr__(self):
        return int.__repr__(self.data)
    
    def __str__(self):
        return int.__str__(self.data)

n = MyInt(10)
m = MyInt(20)
n + m
n - m
n * m
n // m
n / m
n % m

入出力結果(Terminal)

$ ./sample.py
「+」のオーバーロード! (10 + 20 = 30)
「-」のオーバーロード! (10 / 20 = -10)
「+」のオーバーロード! (10 * 20 = 200)
「//」のオーバーロード! (10 // 20 = 0)
「/」のオーバーロード! (10 / 20 = 0.5)
「%」のオーバーロード! (10 % 20 = 10)
$

JavaScriptは演算子のオーバーロードは出来ない(あるいは難しい?)。

0 コメント:

コメントを投稿