Python基礎 継承

今日はPythonの継承について勉強しました。
内容はこちらのページを参考にしています。

www.w3schools.com

以下学んだことを箇条書きでメモします。

継承について以下の説明がありました。

Inheritance allows us to define a class that inherits all the methods and properties from another class.
Parent class is the class being inherited from, also called base class.
Child class is the class that inherits from another class, also called derived class.

継承を使うことで他のクラスの全てのメソッドとプロパティを継承する別のクラスを定義できる。
継承される元のクラスは親クラス、もしくはベースクラスと呼ばれ、親クラスから継承するクラスは子クラスもしくは派生クラスと呼ばれる。

全てのクラスは親クラスになれる。

以下はプロパティにfirstnameとlastnameを持つPersonクラスを定義する例:

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

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

x = Person('testfirst', 'testlast')
x.printname()

ローカルで動作確認。
f:id:JunpeiNakasone:20210310064908p:plain

上記で親クラスを定義したので、Personクラスを継承するStudentクラスを定義します。

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

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


class Student(Person):
    pass

x = Student('studentfirst', 'studentlast')

x.printname()
  • 子クラスを定義するには、子クラスを作成する際にパラメータに親クラスを渡す
  • 親クラスから継承する以外は何もプロパティやメソッドを追加しない場合はpassを使用する

ローカルで動作確認。
f:id:JunpeiNakasone:20210310065447p:plain Sutudentクラスが想定通りプロパティとprintnameメソッドを継承していることが確認できました。

次に、子クラスにinitを追加していきます。

子クラスのpassをinitに変更し、middlenameプロパティを追加します。

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

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


class Student(Person):
    def __init__(self, fname, lname, mname):
        self.middlename = mname

x = Student('studentfirst', 'studentlast', 'studentmiddle')

x.printname()

すると以下のエラーになります。
f:id:JunpeiNakasone:20210310070229p:plain

AttributeError: Student instance has no attribute 'firstname'

これは子クラスにinitを追加すると親クラスのinitを継承しなくなるためです。
- 子クラスのinitは親クラスのinitを上書きする

親クラスのinitを継承するには子クラスのinit内で以下のように呼び出す必要があります。

class Student(Person):
    def __init__(self, fname, lname, mname):
        Person.__init__(self, fname, lname)
        self.middlename = mname

ローカルで動作確認。エラーにならないことが確認できました。
f:id:JunpeiNakasone:20210310070648p:plain