クラス
クラスを使う理由
- 継承
- 合成
- インスタンス
- カスタム化
- 演算子のオーバーロード
クラスを使った例
FirstClass の定義
>>> class FirstClass:
def setdata(self, value):
self.data = value
def display(self):
print self.data
インスタンスオブジェクトの作成
>>> x = FirstClass()
>>> y = FirstClass()
メソッド呼び出しによるデータのセット
>>> x.setdata('King Arthur')
>>> y.setdata(3.14159)
別のメソッド呼び出しでデータを表示
>>> x.display()
King Arthur
>>> y.display()
3.14159
クラスの継承
>>> class SecondClass(FirstClass):
def display(self):
print 'Current value = "%s"' % self.data
>>> z = SecondClass()
>>> z.setdata(42)
>>> z.display()
Current value = "42"
演算子オーバーロード
>>> class ThirdClass(SecondClass):
def __init__(self, value):
self.data = value
def __add__(self, other):
return ThirdClass(self.data + other)
def __mul__(self, other):
self.data = self.data * other
>>> a = ThirdClass("abc")
>>> a.display()
Current value = "abc"
>>> b = a + 'xyz'
>>> b.display()
Current value = "abcxyz"
>>> a * 3
>>> a.display()
Current value = "abcabcabc"
クラスを用いた設計
Python と OOP
- 継承 ... 属性の検索
- ポリモーフィズム ... X.method の意味は X の型に依存する
- カプセル化 ... メソッド・演算子が動作を実装。データ隠蔽は習慣
OOPと継承(is-a)
employees.py で、Chef は Employee の一種
(a Chef is an Employee)
OOPと合成(has-a)
pizzashop.py で、PizzaShop は Server と、
PizzaRobot, Oven を持っている。
(Container object has a part object.)
OOPと代行
(省略)
組み込みオブジェクト型の拡張
集合オブジェクト型の実装
set.py
利用例
>>> from set import Set
>>> a = Set([1,2,3])
>>> b = Set([2,3,4])
>>> a | b
Set:[1, 2, 3, 4]
>>> x = Set('hello')
>>> x
Set:['h', 'e', 'l', 'o']
演習問題
- Adder という名のクラスを作成せよ。このクラスは add(self, x, y)
というメソッドを公開し、それは、"Not Implemented"(実装されていない)
というメッセージを表示するものとする。次にAdderのサブクラスを2つ
定義せよ。それらは次のようにaddメソッドを実装するものとする。
- ListAdder これの add メソッドは2つのリスト引数を連結したものを返す。
- DictAdder これの add メソッドは2つのディクショナリ引数の両方に
存在する要素からなる新規なディクショナリを返す(加算の定義は何でもよい)。
これら3つのクラスを adderclass.py という名前のモジュールに作成し、
from adderclass import * した後、対話的にこれらのクラスの
インスタンスを作成せよ。また、それぞれの addメソッドを
呼び出して実験せよ。
- 1.のモジュールファイルを書き換えて、オブジェクト(リストまたはディクショナリ)
をコンストラクタの中に格納するようにし、「+」演算子をオーバーロードして
add メソッドを置き換えよ。これらのコンストラクタと演算オーバーロード
はどのクラスに置くのが最適だろうか。