オブジェクト指向 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 + 'だお!')