Python 速習チュートリアル

Python の継承

1. Pythonの継承 (Inheritance)

継承(Inheritance)とは、あるクラスのすべてのメソッドとプロパティを、別のクラスに引き継がせる仕組みのことです。

  • 親クラス(Parent class):継承元のクラス。ベースクラス(Base class)とも呼ばれます。
  • 子クラス(Child class):別のクラスから継承するクラス。派生クラス(Derived class)とも呼ばれます。

2. 親クラスの作成

親クラスの作成方法は、通常のクラス作成と同じです。

2.1 親クラスの定義例

firstnamelastname というプロパティ、および printname というメソッドを持つ Person クラスを作成します。

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

  def printname(self):
    print(self.firstname, self.lastname)

# Personクラスを使用してオブジェクトを作成し、printnameメソッドを実行する
x = Person("John", "Doe")
x.printname()

3. 子クラスの作成

別のクラスから機能を継承する子クラスを作成するには、クラスを定義する際のパラメータとして親クラスを渡します。

3.1 子クラスの定義例

Person クラスのプロパティとメソッドを継承する Student クラスを作成します。

class Student(Person):
  pass
クラスに新しいプロパティやメソッドを追加したくない場合は、pass キーワードを使用します。

これで、Student クラスは Person クラスと同じプロパティとメソッドを持つようになります。

# Studentクラスを使用してオブジェクトを作成し、printnameメソッドを実行する
x = Student("Mike", "Olsen")
x.printname()

4. init() 関数の追加

これまでは pass キーワードを使用して親クラスの機能をそのまま継承してきましたが、今度は子クラスに __init__() 関数を直接追加してみましょう。

4.1 子クラスへの init() 実装

__init__() 関数は、そのクラスから新しいオブジェクトが作成されるたびに自動的に呼び出されます。

class Student(Person):
  def __init__(self, fname, lname):
    # プロパティの追加などを行う

子クラスに __init__() 関数を追加すると、子クラスは親クラスの __init__() 関数を継承しなくなります

子クラスの __init__() 関数は、親クラスの __init__() 関数の継承をオーバーライド(上書き)します。

親クラスの __init__() 関数の継承を維持したい場合は、子クラスの中で親クラスの __init__() 関数を明示的に呼び出す必要があります。

4.2 親クラスの初期化を呼び出す

class Student(Person):
  def __init__(self, fname, lname):
    # 親クラスの初期化メソッドを呼び出す
    Person.__init__(self, fname, lname)

これで、親クラスの継承を維持したまま、子クラス独自の初期化処理を追加する準備が整いました。

5. super() 関数の利用

Pythonには、子クラスに親クラスのすべてのメソッドとプロパティを継承させるための super() 関数が用意されています。

5.1 super() を使った継承

class Student(Person):
  def __init__(self, fname, lname):
    # 親クラスの名前を直接書かずに継承が可能
    super().__init__(fname, lname)

super() 関数を使用すると、親要素の名前を指定する必要がなくなり、自動的に親クラスからメソッドやプロパティを継承できるようになります。

6. プロパティの追加

子クラスに独自のプロパティを追加する方法を確認しましょう。

6.1 新しいプロパティの定義

Student クラスに graduationyear というプロパティを追加します。

class Student(Person):
  def __init__(self, fname, lname):
    super().__init__(fname, lname)
    self.graduationyear = 2019

以下の例では、2019 という固定値ではなく、オブジェクト作成時に引数(変数)として year を渡せるように改良しています。

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

x = Student("Mike", "Olsen", 2019)
print(x.graduationyear)

7. メソッドの追加

プロパティと同様に、子クラスに独自のメソッドを追加することもできます。

7.1 子クラスへのメソッド追加例

Student クラスに welcome メソッドを追加します。

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

  def welcome(self):
    print("ようこそ", self.firstname, self.lastname, "さん。", self.graduationyear, "年度のクラスへ。")

x = Student("Mike", "Olsen", 2019)
x.welcome()
子クラスに親クラスの関数と同じ名前のメソッドを追加した場合、親クラスのメソッドはオーバーライドされます。これにより、特定のクラスに合わせて挙動をカスタマイズすることが可能です。