Pythonの継承とは?単一継承・他重継承|具体例付きで徹底解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年10月)

✔当記事は次のような疑問を持つ読者のために書かれています

「Pythonの継承とは何か?」
「Pythonでの継承の設定方法を知りたい」
「Pythonで継承を使ったプログラムの例を見たい」

✔当記事を読むことで得られる知識

  • Pythonにおける継承の基本概念
  • Pythonでの継承の設定方法とその適用
  • Pythonを用いた継承の具体的な使用例

当記事では、Pythonでの継承の基本理解から始まり、その設定方法や実際の適用例について、具体的なサンプルを交えて詳細に解説しています。

ぜひ、最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Pythonとオブジェクト指向プログラミング

こちらでは、「Pythonとオブジェクト指向プログラミング」について見ていきましょう。

「Pythonとオブジェクト指向プログラミング」を理解することで、効率的なコードの設計と保守性の向上が期待できます。

  • Pythonとオブジェクト指向プログラミングの基礎
  • Pythonのクラスとオブジェクト

Pythonとオブジェクト指向プログラミングの基礎

オブジェクト指向プログラミング(Object-Oriented Programming: OOP)は、データ(属性)とそのデータを操作するための手段(メソッド)をひとつのオブジェクトとしてまとめるという考え方です。

Pythonはその設計哲学の一部としてOOPを取り入れています。

Pythonでのオブジェクト指向プログラミングの最も基本的な要素は、”クラス”と”オブジェクト”です。

Pythonのクラスとオブジェクト

Pythonの”クラス”は、オブジェクトの設計図のようなもので、データとそのデータを扱うメソッドをひとつにまとめたものです。

“オブジェクト”は、クラスから生成されるインスタンスで、実際にプログラムで操作をおこなう主体となります。

例えば、”Car”というクラスを設計したとき、そのクラスから生成される各”Car”オブジェクトが、それぞれ異なる状態(例えば色や速度)を持てるのです。

class Car:
    def __init__(self, color, speed=0):
        self.color = color
        self.speed = speed

my_car = Car("blue")
print(my_car.color)  # blue

my_car2 = Car("yellow")
print(my_car2.color) # yellow

Pythonとオブジェクト指向プログラミングの基礎を理解することで、コードの構造化やデータの管理がしやすくなります。

続いて、このオブジェクト指向プログラミングにおいて重要な概念である「継承」について詳しく見ていきましょう。

継承の基本

こちらでは、Pythonにおける継承の基本的な概念について詳しく説明していきます。

継承は、オブジェクト指向プログラミングの重要な概念のひとつで、Pythonに限らず多くのプログラミング言語で利用されています。

  • 継承の役割と利点
  • Pythonでの継承の定義と構文

継承の役割と利点 (Role and Advantages of Inheritance)

継承は、あるクラス(親クラスまたは基底クラス)の属性やメソッドを別のクラス(子クラスまたは派生クラス)が引き継ぐことを可能にする仕組み。

例えば、犬と動物というクラスを考えてみます。

そのクラスの関係性は、犬クラスが動物クラスから継承しているという現実世界にい置き換えることが可能です。

また継承を活用することで、コードの再利用を促進し、プログラムの複雑さを軽減します。

親クラスで定義されたメソッドを子クラスで再定義する必要がなくなり、コードの冗長性を減らせるのです。

Pythonでの継承の定義と構文

Pythonでは、クラスを定義する際に親クラスを括弧内に指定することで継承を実現します。

class ParentClass:
    pass

class ChildClass(ParentClass):
    pass

この構文により、ParentClassの全ての公開属性やメソッドはChildClassに引き継がれます。

そのため、ParentClassで定義したメソッドは、ChildClassのオブジェクトでも利用可能です。

class Animal:
    def greet(self):
        print("こんにちは、私は動物です。")

class Dog(Animal):
    pass

dog = Dog()
dog.greet()  # 出力:"こんにちは、私は動物です。"

複数のクラスで共通したメソッドを親クラスに書き出せば、重複した記述がなくせます

Pythonでの単一継承の方法

こちらでは、Pythonでの単一継承の実装について深く見ていきましょう。

単一継承は、ひとつの親クラスからひとつの子クラスが属性とメソッドを継承する形態を指します。

  • 単一継承の基礎
  • 実際の単一継承の例

単一継承の基礎

単一継承は、親クラスから子クラスへと一方向に属性やメソッドが継承されるもの。

多くのプログラミング言語で基本となる継承の形です。

単一継承では、子クラスは親クラスの全ての公開メソッドと属性を利用でき、それらの拡張またはカスタマイズが可能になります。

実際の単一継承の例

単一継承の実例として、Animal(動物)クラスからDog(犬)クラスを継承する例を考えてみましょう。

ここでは、DogクラスがAnimalクラスのgreetメソッドを継承し、さらに自身のメソッドbarkを追加しています。

class Animal:
    def greet(self):
        print("こんにちは、私は動物です。")

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

dog = Dog()
dog.greet()  # 出力 "こんにちは、私は動物です。"
dog.bark()  # 出力 "ワンワン!"

この例からわかるように、単一継承は子クラスが親クラスの機能を利用し拡張するための強力なツールです。

メソッドの上書き:オーバーライド

こちらでは、オーバーライドについて説明します。

オーバーライドとは、子クラスが親クラスのメソッドを新しい機能で上書きすることです。

  • オーバーライドの基本
  • Pythonでのオーバーライドの使用方法

オーバーライドの基本

オーバーライドは、子クラスが親クラスから継承したメソッドの振る舞いを変更する際に用いられます

この特性を利用すると、子クラスは親クラスのメソッドを新しい実装で上書きし、異なる動作が可能。

ただしオーバーライドを使用する際は、メソッドの互換性を保つことが重要です。

Pythonでのオーバーライドの使用方法

Pythonにおけるオーバーライドの例を見てみましょう。

先ほどのAnimalクラスとDogクラスを再び使用し、Dogクラスがgreetメソッドをオーバーライドします。

class Animal:
    def greet(self):
        print("Hこんにちは、私は動物です。")

class Dog(Animal):
    def greet(self):
        print("ワンワン、私は犬です。")

dog = Dog()
dog.greet()  # 出力 "ワンワン、私は犬です。"

ここで、DogクラスはAnimalクラスのgreetメソッドを上書き(オーバーライド)しました。

Pythonにおける多重継承

こちらでは、Pythonにおける多重継承について学びましょう。

多重継承とは、ひとつのクラスが複数の親クラスから継承することを指します。

  • 多重継承の概念
  • 多重継承の具体的な方法

多重継承の概念

多重継承は、ひとつのクラスが複数の親クラスから継承するプログラミングのパターンです。

これにより、一つのクラスが複数の親クラスの属性やメソッドを同時に受け継ぐことが可能となります。

ただし、多重継承を行う際には、継承の順序やスーパークラス間の名前の衝突など、特有の問題への対処が必要です。

多重継承の具体的な方法

Pythonでの多重継承の具体的な使用方法を見てみましょう。

ここでは、FlyingSwimmingという二つのクラスを定義し、両方の機能を持つDragonクラスを多重継承を用いて作成します。

class Flying:
    def fly(self):
        print("空を飛びます。")

class Swimming:
    def swim(self):
        print("水の中を泳ぎます。")

class Dragon(Flying, Swimming):
    pass

dragon = Dragon()
dragon.fly()  # 出力 "空を飛びます。"
dragon.swim()  # 出力 "水の中を泳ぎます。"

DragonクラスはFlyingSwimmingの両クラスから継承をおこない、両クラスのメソッドを使用できます。

ただし、多重継承は複雑性を増す可能性があるため、使用する際には注意が必要です。

MROと協調的多重継承

PythonのMethod Resolution Order(MRO)と協調的多重継承についてご覧いただきます。

これらの概念は、特に多重継承を使用する際に重要です。

  • MROとは
  • 協調的多重継承の役割と方法

MROの説明

Method Resolution Order(MRO)とは、Pythonが複数のスーパークラスからメソッドを探索する際の順序を決定するルールです。

Pythonでは、クラスが同じ名前のメソッドを持っている場合、MROに従ってどのメソッドを使うべきか決定します。

Pythonでは、クラスのmroメソッドまたは__mro__属性を使用して、特定のクラスのMROを確認できます。

class A: 
    pass
class B(A): 
    pass
class C(A): 
    pass
class D(B, C): 
    pass

print(D.mro())  # 出力 [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

この例では、クラスDのMROはD、B、C、A、objectの順番となっています。

協調的多重継承の役割と方法

協調的多重継承とは、スーパークラスのメソッドを呼び出す際にsuper()関数を用いて、MROに従って適切にメソッドを呼び出す方式です。

これにより、各スーパークラスのメソッドが適切に呼び出され、多重継承の際の問題を回避できます。

以下に協調的多重継承の例を示します。

class A:
    def process(self):
        print('A process()')

class B(A):
    def process(self):
        print('B process()')
        super().process()

class C(A):
    def process(self):
        print('C process()')
        super().process()

class D(B, C):
    pass

d = D()
d.process()
# Output:
# B process()
# C process()
# A process()

上記の例では、Dのインスタンスdprocessメソッドを呼び出すと、MROに従ってBCAprocessメソッドが順番に呼び出されます。

これが協調的多重継承の一例です。

initとsuperの使用法

次に、__init__メソッドとsuper関数の使用法について詳しく見ていきましょう。

これらはPythonのオブジェクト指向プログラミングにおいて、クラスの初期化とスーパークラスのメソッドへのアクセスを管理するために不可欠な要素です。

  • initとsuperの概要 (Overview of init and Super)
  • Pythonにおけるinitとsuperの呼び出し方法 (Calling init and Super in Python)

initとsuperの概要

__init__はPythonの特殊メソッドで、クラスから新しいオブジェクトが作成される際に自動的に呼び出されます

このメソッドは通常、オブジェクトの初期化に用いられるもの。

一方、superは組み込み関数で、子クラスから親クラスのメソッドを直接呼び出すために使用します。

Pythonにおけるinitとsuperの呼び出し方法

Pythonで__init__メソッドを定義するには、通常以下のようにします。

class MyClass:
    def __init__(self, value):
        self.value = value

一方、superを使用して親クラスのメソッドを呼び出すには以下のようにします。

class MyChildClass(MyClass):
    def __init__(self, value):
        super().__init__(value)

上記のMyChildClassでは、super().__init__(value)を使って親クラスの__init__メソッドを呼び出しています。

これにより、親クラスの初期化が子クラスで適切におこなわれます。

まとめ

当記事でお伝えした内容は以下のとおりです。

  • Pythonのオブジェクト指向プログラミングとクラス、オブジェクトとは何か
  • 継承の基本とその役割、Pythonでの継承の定義と構文
  • 単一継承とメソッドのオーバーらいだお
  • 多重継承と協調的多重継承、PythonのMROとは
  • __init__メソッドとsuper関数の使用法

Pythonの継承の学習を深めるには、実際にコードを書き、実験し、異なるタイプの継承とそれらがどのように動作するかを試すことが重要です。

それぞれのクラスとメソッドがどのように動作し、どのように相互作用するかを理解することで、より効果的なコードを書けるようになるでしょう。

この記事がPythonのクラス継承の理解に役立つことを願っています。

タイトルとURLをコピーしました