初心者のためのpython入門

自分がつまづいたところやつまづきやすいところを中心に書いていきます。また、役に立つライブラリの紹介などをしていきます。

継承[2]

継承をより詳しく

前回は、継承の基礎を説明しました。継承とは、既存のクラスを指定し、追加や変更したい一部だけを定義することにより新しいクラスを定義する方法でした。今回は、もう少し詳しく、継承におけるメソッドのオーバーライドや多重継承について説明したいと思います。

メソッドのオーバーライド

メソッドのオーバーライドとは、親クラスに既に存在するメソッドを子クラスで上書き(オーバーライド)して使用する方法です。

# hero.py
class Hero():
    def __init__(self, name):
        self.name = name

    def self_introduction(self):
        print("私の名前は勇者"+self.name+"です。")

class SuperHero(Hero):
    def self_introduction(self):
        print("こんにちは。")
        print("私の名前はスーパー勇者"+self.name+"です。")


hero = Hero('ヨシヒコ')
superhero = SuperHero('ヨシピコ')

hero.self_introduction()
superhero.self_introduction()
# 実行結果 (python hero.py)
私の名前は勇者ヨシヒコです。
こんにちは。
私の名前はスーパー勇者ヨシピコです。

上記のプログラムは、親クラスのself_introductionメソッドを子クラスでオーバーライドしています。オーバーライドの方法は次のようになります。

  1. 親クラスに存在するメソッドと同じようにメソッドを定義する。
  2. 子クラスの方で使いたいように処理を変える。

以上のようにすればオーバーライド完了です。実際に実行結果を見てみるとオーバーライドできている事がわかると思います。

superの使用

子クラスのメソッド内で親クラスのメソッドを呼び出した時はsuperを使用します。

# hero.py
class Hero():
    def __init__(self, name):
        self.name = name

    def self_introduction(self):
        print("私の名前は勇者"+self.name+"です。")

class SuperHero(Hero):
    def __init__(self, name, position):
        super().__init__(name)
        self.position = position

    def self_introduction(self):
        print("私の名前は"+self.position+"勇者"+self.name+"です。")


hero = Hero('ヨシヒコ')
superhero = SuperHero('ヨシピコ', 'スーパー')

hero.self_introduction()
superhero.self_introduction()
# 実行結果 (python hero.py)
私の名前は勇者ヨシヒコです。
私の名前はスーパー勇者ヨシピコです。

今回のプログラムでは、子クラス内で__init__メソッドをオーバーライドしていますが、その中で親クラスの__init__メソッドを呼び出しています。このようにsuperを用いて、親クラス内で既に定義されているメソッドを使用することができます。それにより、効率的にプログラムを拡張できます。

多重継承

Pythonは多重継承をサポートしています。しかし、多重継承は継承関係やインスタンス変数の共有などがわかりにくくなるため、自分でプログラムを作成する場合は、あまり使わない方が良いでしょう。

継承関係の表示

pythonのクラスの継承関係を調べるにはmroメソッドを使います。

  • Class.mro(): クラスの継承関係を表示する
# sample.py
class Human():
    pass

class Hero(Human):
    pass

print(Human.mro())
print(Hero.mro())

print(str.mro())
print(int.mro())
# 実行結果 (sample.py)
[<class '__main__.Human'>, <class 'object'>]
[<class '__main__.Hero'>, <class '__main__.Human'>, <class 'object'>]
[<class 'str'>, <class 'object'>]
[<class 'int'>, <class 'object'>]

上記のように継承関係を表示する事ができます。Pythonのクラスは全てObjectクラスの子クラスになります。

最後に

お疲れ様でした。次回は多態性ついて説明したいと思います。