Python 入門

ホーム > オブジェクト指向プログラミング > クラス定義の基本

クラス定義の基本

クラス定義

ここでは Python でクラスを定義するときの基本的な書き方について、ざっと見ていきましょう。

具体的にこんなクラス図となる Person クラスを考えます。

Python クラス定義例

まずクラスを定義するときには、class キーワードを用いて、明示的に行います。

コンストラクタは __init__ メソッドとして定義します。第一引数が self で、それぞれのインスタンスをさします。 (Java や C++ の this のようなものです) 第二引数からユーザー定義のパラメータが来ます。デフォルトの値がある場合は、=<値> で指定します。

class Person:
	def __init__(self, name, age):
		print '[Person.__init__]'
		self.name = name
		self.age = age
	def showinfo(self):
		print '[Person.showinfo]'
		print '%s (%d)' % (self.name, self.age) 	

上の例では、Person という名前のクラスを定義して、コンストラクタで nameage という二つの引数を受けとることを定義しました。

そして、その中で print でトレースを出力してから、self.nameself.age に値を設定します。 インスタンスの属性を設定するのは、このように self.属性名 という形で設定します。

showinfo というメソッドでは、name と age という二つの属性にセットされた値を print で出力しています。

では、この Person クラスを使うコードを見てみましょう。

上のコードを person.py というファイル (モジュール) に保存しているとします。そうすると from ... import は以下のようになります。

from person import Person

p1 = Person('Ichiro Suzuki', 37)
p2 = Person('Hanako Yamada', 35)

p1.showinfo()
p2.showinfo()

インスタンスを生成するのは、クラス名と同じ名前のメソッドです。(他のオブジェクト指向言語でよくみる new キーワードは使いません)

実行結果は次の通りです。

[Person.__init__]
[Person.__init__]
[Person.showinfo]
Ichiro Suzuki (37)
[Person.showinfo]
Hanako Yamada (35)

確かにコンストラクタ (__init__メソッド) も呼ばれており、また、それぞれのインスタンス毎に別々の値を持っていることも分かりますね。

継承

続いて継承です。Person クラスを継承して、Employee クラスを定義しましょう。従業員 (employee) は人 (person) ですから、いわゆる "is-a" の関係ですね。

Python クラス定義例

この図を見て分かるように、追加したのは company という属性だけです。コンストラクタで受け取って、それを属性に保持します。

from person import Person

class Employee(Person):
	def __init__(self, name, age, company):
		print '[Employee.__init__]'
		Person.__init__(self, name, age)
		self.company = company	
	def showinfo(self):
		print '[Employee.showinfo]'
		print '%s (%d) %s' % (self.name,self.age,self.company) 

まず、親クラスは クラス名 (親クラス名) として指定します。

そして、親クラスのコンストラクタを呼ぶのは クラス名.__init__ という形で呼び出します。 ここでは Employee.__init__ 内で Person.__init__ を呼び出していることが分かります。

ちなみに、この内容は employee.py に保存しました。

さて、では動作確認をしましょう。

from employee import Employee 

p = Employee('Hanako Yamada', 35, 'Yoshimoto')

p.showinfo()

実行結果は次の通りです。

[Employee.__init__]
[Person.__init__]
[Employee.showinfo]
Hanako Yamada (35) Yoshimoto

トレースの結果、Employee, Person 両方のコンストラクタが呼ばれていることがわかりますね。そして、確かに showinfo はオーバーライドした方のメソッドが呼ばれていることが分かります。

ホーム > オブジェクト指向プログラミング > クラス定義の基本