1. ホーム 
  2. 備忘録 
  3. Python

継承

クラスの継承

Pythonはマルチパラダイム(多思想)な言語であり、オブジェクト指向も取り入れている

Pythonでクラスの継承を行う方法を以下に記載する

lesson.py

class Animal(object):
    def greet(self):
        print('こんにちは')

class Dog(Animal):
    def bark(self):
        print('ワンワン!!')

class Cat(Animal):
    def greet(self):
        print('こんにちニャ')

dog = Dog()
dog.greet()  # こんにちは
dog.bark()  # ワンワン!!

cat = Cat()
cat.greet()  # こんにちニャ
cat.bark()  # AttributeError: 'Cat' object has no attribute 'bark'

上記サンプルのとおり、Animal クラスをベースに Dog クラスと Cat クラスを作成している

Dog クラスではベースクラスにない bark メソッドを定義しており、Cat クラスではベースクラスにある greet メソッドをオーバーライドしている

Cat クラスには bark メソッドを書いていないため、呼び出そうとするとエラーが発生する


super()

先ほどの例で Cat クラスはベースクラスである Animal クラスの greet メソッドをオーバーライドしていたが、継承先のクラスから継承元のクラスのメソッドを呼び出すこともできる

継承元のクラスを呼び出すには super() を使う

以下に super() を使った例を記載する

lesson.py

class Animal(object):
    def __init__(self):
        print('Animal側のコンストラクタが呼び出されました')

    def greet(self):
        print('こんにちは')

class Cat(Animal):
    def __init__(self, name):
        super().__init__()
        print('Cat側のコンストラクタが呼び出されました')
        print(f'吾輩は{name}である')

    def greet(self):
        super().greet()
        print('こんにちニャ')

cat = Cat('Mike')
cat.greet()
# 結果
# Animal側のコンストラクタが呼び出されました
# Cat側のコンストラクタが呼び出されました
# 吾輩はMikeである
# こんにちは
# こんにちニャ