クラス

クラスを使う理由

クラスを使った例

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

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']

演習問題

  1. Adder という名のクラスを作成せよ。このクラスは add(self, x, y) というメソッドを公開し、それは、"Not Implemented"(実装されていない) というメッセージを表示するものとする。次にAdderのサブクラスを2つ 定義せよ。それらは次のようにaddメソッドを実装するものとする。 これら3つのクラスを adderclass.py という名前のモジュールに作成し、 from adderclass import * した後、対話的にこれらのクラスの インスタンスを作成せよ。また、それぞれの addメソッドを 呼び出して実験せよ。
  2. 1.のモジュールファイルを書き換えて、オブジェクト(リストまたはディクショナリ) をコンストラクタの中に格納するようにし、「+」演算子をオーバーロードして add メソッドを置き換えよ。これらのコンストラクタと演算オーバーロード はどのクラスに置くのが最適だろうか。