2013年1月5日土曜日

開発環境

『初めてのPython 第3版』(Mark Lutz 著、夏目 大 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-393-7) のVI部(オブジェクト指向プログラミング)のまとめ演習3.(サブクラスの作成)を解いてみる。

その他参考書籍

3.(サブクラスの作成)

コード(BBEdit)

sample.py

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

# メッセージを表示するようにリストのいくつかの機能をオーバーロードしてみる
class MyList(list):
    def __init__(self, data):
        list.__init__(self, data)
    def __add__(self, y):
        return MyList(list.__add__(self, y))
    def __getitem__(self, y):
        return list.__getitem__(self, y)
    def __iadd__(self, y):
        return MyList(list.__iadd__(self, y))
    def __imul__(self, y):
        return MyList(list.__imul__(self, y))
    def __mul__(self, n):
        return MyList(list.__mul__(self,n))
    def __rmul__(self, n):
        return MyList(list.__rmul__(self, n))
    def copy(self):
        return MyList(list.copy(self))

class MyListSub(MyList):
    count = 0
    def __init__(self, data):
        print("コンストラクタ")
        self.count = 1
        MyListSub.count += 1
        MyList.__init__(self, data)
    def __add__(self, y):
        self.count += 1
        MyListSub.count += 1
        print("add")
        return MyListSub(MyList.__add__(self, y))
    def __getitem__(self, y):
        self.count += 1
        MyListSub.count += 1 
        return MyList.__getitem__(self, y)
    def __iadd__(self, y):
        self.count += 1
        MyListSub.count += 1
        print("iadd")
        return MyListSub(MyList.__iadd__(self, y))
    def __imul__(self, y):
        self.count += 1
        MyListSub.count += 1
        print("imul")
    def __mul__(self, n):  
        self.count += 1
        MyListSub.count += 1
        print("mul")
        return MyListSub(MyList.__mul__(self, n))
    def __rmul__(self, n):
        self.count += 1
        MyListSub.count += 1
        print("rmul")
        return MyListSub(MyList.__rmul__(self, n))
    def copy(self):
        print("copy")
        return MyListSub(MyList.copy(self))
    def counter(self):
        print("インスタンス属性:{0}回, クラス属性:{1}".format(
          self.count, MyListSub.count))

a = MyListSub([1,2,3,4,5])
b = MyListSub(['a','b','c','d','e'])
print(a + b)
print(a + ['a','b'])
print([10,100] + b)
a.append("python")
for x in [a, b, a + b, a[:], a[1], b[1]]:
    print(x, type(x))
a.counter()
b.counter()

入出力結果(Terminal)

$ ./sample.py
コンストラクタ
コンストラクタ
add
コンストラクタ
[1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e']
add
コンストラクタ
[1, 2, 3, 4, 5, 'a', 'b']
[10, 100, 'a', 'b', 'c', 'd', 'e']
add
コンストラクタ
[1, 2, 3, 4, 5, 'python'] <class '__main__.MyListSub'>
['a', 'b', 'c', 'd', 'e'] <class '__main__.MyListSub'>
[1, 2, 3, 4, 5, 'python', 'a', 'b', 'c', 'd', 'e'] <class '__main__.MyListSub'>
[1, 2, 3, 4, 5, 'python'] <class 'list'>
2 <class 'int'>
b <class 'str'>
インスタンス属性:6回, クラス属性:11
インスタンス属性:2回, クラス属性:11
$

0 コメント:

コメントを投稿