オブジェクト指向 2
コンストラクタ
__init__と名前のついたメソッドのことをコンストラクタと呼びます。
このメソッドは特殊で、インスタンスが生成されるときに呼び出されます。
class Human:
def __init__(self):
# インスタンス生成時に呼ばれる
print('自分がつくられていくぅ〜〜')
# このタイミングで、
# human.__init__()が呼ばれる
# => 自分がつくられていくぅ〜〜
human = Human()
継承
他のクラスを元に、新しいクラスを作ることを、継承といいます。 継承元のクラスをスーパークラス(親クラス)、継承先のクラスをサブクラス(子クラス)といいます。
例えば下図は、どうぶつというスーパークラスから、 実際のねこや人間のクラスを生成する図です。

画像のリンク元はこちら
# Human クラス
# Hero クラスのスーパークラス
class Human:
def __init__(self, name):
self.name = name
def greet(self):
print('こんにちは!' + self.name + 'です!')
# Hero クラス
# Human クラスのサブクラス
class Hero(Human):
def __init__(self, name):
# ここで Human クラスの
# コンストラクタを実行する
super().__init__(name)
def attack(self):
print('こうげき〜〜〜!!!!')
# Human クラスのインスタンスを作成する
human = Human('人間1')
# greet メソッドを実行する
# => こんにちは!人間1です!
human.greet()
# Hero クラスのインスタンスを作成する
hero = Hero('勇者A')
# greet メソッドを実行する( Human クラスで定義 )
# => こんにちは!勇者Aです!
hero.greet()
# attack メソッドを実行する( Hero クラスで定義 )
# => こうげき〜〜〜!!!!
hero.attack()
継承元のメソッドやインスタンス変数を、 継承先で上書きすることもできます。
# Human クラス
# Hero クラスのスーパークラス
class Human:
def __init__(self, name):
self.name = name
self.hp = 100
def greet(self):
print('こんにちは!')
# Hero クラス
# Human クラスのサブクラス
class Hero(Human):
def __init__(self, name):
# ここで Human クラスの
# コンストラクタを実行する
super().__init__(name)
self.hp = 1000
def greet(self):
# Humanクラスで定義された
# greetメソッドを上書きする
print('私が来たァ!!!!!')
def attack(self):
print('こうげき〜〜〜!!!!')
# Human クラスのインスタンスを作成する
human = Human('人間1')
# greet メソッドを実行する
# => こんにちは
human.greet()
# Hero クラスのインスタンスを作成する
hero = Hero('勇者A')
# greet メソッドを実行する( Hero クラスで定義 )
# => こんにちは!勇者Aです!
hero.greet()
# attack メソッドを実行する( Hero クラスで定義 )
# => こうげき〜〜〜!!!!
hero.attack()
演習 1
greet メソッドを持つ、
Human クラスが定義されている。
Human クラスを書き換えて、
「引数として名前を受け取り、
それをインスタンス変数 name に代入する」処理を行う、
コンストラクタを定義して下さい。
また動作確認のために、
クラスからインスタンスを生成し、
greet メソッドを呼んでみて下さい。
このときコンストラクタに与える引数は 太郎 にして下さい。
# Human クラス
# このクラスを修正していく
class Human:
def greet(self):
print('こんにちは!' + self.name + 'です!')
# インスタンスの生成
human = Human("太郎")
# greetメソッドの呼び出し
human.greet()
演習 2
greet メソッドを持つ、Human クラスが定義されている。
Human クラスを継承した、Wotaku クラスを定義して下さい。
しかし Wotaku クラスでの、greetメソッドを上書きし、
表示する挨拶を「こんにちは!{名前}だお」にすること。
また動作確認のために、
クラスからインスタンスを生成し、
greet メソッドを呼んでみて下さい。
このときコンストラクタに与える引数は 太郎 にして下さい。
class Human:
def __init__(self, name):
# 名前
self.name = name
def greet(self):
print('こんにちは!' + self.name + 'だお!')