• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar
  • Skip to footer

AI活用エンジニアへの道

生成AI時代のエンジニアの生き方を考えるメディア(作成途中)

  • コラム
  • 生成AI
  • プログラミング
    • Python入門
    • Flask入門
    • Django入門
  • プロフィール
Home / プログラミング / Python / Pythonのクラスの継承とオーバーロード、super()の利用方法、多重継承についてまとめました。

Pythonのクラスの継承とオーバーロード、super()の利用方法、多重継承についてまとめました。

1 クラスの継承の基本
2 メソッドのオーバーライド、super()で親クラスのメソッドを呼び出す
3 多重継承の方法
4 関連記事

クラスの継承の基本

クラスの継承とは、クラスで別クラスのプロパティ、メソッドを引き継ぐ機能のことを言う

BクラスがAクラスを継承している図

クラスを継承すると、プロパティとメソッドが引き継がれる。
継承元のクラスを子クラス、継承先のクラスを親クラスと言う

この際、_(アンダースコア)が2つのプライベートプロパティ、プライベートメソッドは継承先で利用できない

クラスを継承する場合は、以下のようにclass クラス名(継承元クラス):とする
継承先を指定しないとき、Objectクラスを継承したことになる。


class BaseClass:
# 継承元クラス
class DerivedClass(BaseClass):
# 継承先クラス

では、実際にクラスの継承を事例を見てみましょう。

  • コンストラクタの定義
class Person: # 継承元クラス

    def __init__(self, name, age): # コンストラクタ
        self.name = name
        self.age = age

    def print_msg(self):
        print(f"Hello! I'm {self.name}")

class Student(Person): # Personを継承
    pass # プロパティ、メソッドを定義していないが、Personで定義したプロパティ、メソッドは持っている

jim = Student('Jim', 21) # Studentの初期化
print(jim.name) # Jim
print(jim.age) # 21
jim.print_msg() # Hello! I'm Jim

  • 継承先で新たにメソッドを定義する
class Person: # 親クラス

    def __init__(self, name, age): # コンストラクタ
        self.name = name
        self.age = age

    def print_msg(self):
        print(f"Hello! I'm {self.name}")

class Student(Person): # Personを継承
    def print_student(self):
        print('A校の生徒です')

jim = Student('Jim', 21) # Studentの初期化
jim.print_student() # A校の生徒です

john = Person('John', 21) # Personの初期化
john.print_student() # メソッドがないためエラー

メソッドのオーバーライド、super()で親クラスのメソッドを呼び出す

子クラスで親クラスの持っているメソッドを書き換えることをオーバーライドと言う。
この場合、子クラスからはオーバーライドしたメソッドが呼び出される。

  • メソッドのオーバーライド
class Person: # 継承元クラス

    def __init__(self, name, age): # コンストラクタ
        self.name = name
        self.age = age

    def print_msg(self):
        print(f"Hello! I'm {self.name}")

class Student(Person): # Personを継承
    def print_msg(self):
        print(f"私{self.name}は、A校の生徒です") # 親クラスのプロパティself.nameにアクセス

jim = Student('Jim', 21) # Studentの初期化
jim.print_msg() # 私jimは、A校の生徒です

john = Person('John', 21) # Personの初期化
john.print_msg() # Hello! I'm John

親クラスのメソッドを子クラスから直接呼び出すことができる。
この際、_(アンダースコア)が2つのプライベートメソッドは呼び出すことができない
また、コンストラクタを呼び出すこともできる。

親クラスのメソッドを呼び出したい場合は、
super().メソッド名(引数)
とする。

  • 親クラスのメソッドを呼び出す

class Person:
    def __init__(self, name, age): # コンストラクタ
        self.name = name
        self.age = age

    def print_msg(self):
        print(f"Hello! I'm {self.name}")

class Student(Person): # Personを継承
    def print_msg(self):
        super().print_msg()
        print(f"私{self.name}は、A校の生徒です")

jim = Student('Jim', 21) # Studentの初期化
jim.print_msg() # Hello! I'm Jim→私Jimは、A校の生徒です

  • 親クラスのコンストラクタを呼び出す

class Person:
    def __init__(self, name, age): # コンストラクタ
        self.name = name
        self.age = age

    def print_msg(self):
        print(f"Hello! I'm {self.name}")

class Student(Person): # Personを継承

    def __init__(self, name, age, school_name):
        super().__init__(name, age) # 親クラスのコンストラクタを呼び出し、name, ageを設定
        self.school_name= school_name# プロパティschool_nameを設定

    def print_msg(self):
        super().print_msg()
        print(f"私{self.name}は、{self.school_name}の生徒です")

jim = Student('Jim', 21, 'A校') # school_nameをA校に指定して、Studentを初期化
jim.print_msg() # Hello! I'm Jim→私Jimは、A校の生徒です

多重継承の方法

pythonの多重継承は、
class ClassA(ClassB, ClassC):
と記述する。
(上の例では、ClassB,ClassCを継承する)

また、継承先で同じ名前のプロパティ、メソッドがある場合には、先に継承したもの、つまり、()内でより左にあるものが優先される。

CがAとBを継承

また、この際親クラスのメソッドを呼び出す場合には、親クラス名.メソッド名(引数)とする。

以下、例を示す。(親クラスの初期化についても記載)

  • クラスの多重継承
class ClassA:
    def __init__(self, name):
        self.a_name = name

    def print_a(self):
        print(f"a = {self.a_name}")

    def print_hi(self):
        print("A hi")

class ClassB:
    def __init__(self, name):
        self.b_name = name

    def print_b(self):
        print(f"b = {self.b_name}")

    def print_hi(self):
        print("B hi")

class NewClass(ClassA, ClassB): # クラスの多重継承
    def __init__(self, a_name, b_name, name):
        ClassA.__init__(self, a_name) # 親クラスClassAのプロパティ初期化
        ClassB.__init__(self, b_name) # 親クラスClassBのプロパティ初期化
        self.name = name

    def print_name(self):
        print(f"name = {self.name}")

sample = NewClass("A君", "B君", "C君")

sample.print_a() # a = A君と表示
sample.print_b() # b = B君と表示
sample.print_name() # name = C君と表示

sample.print_hi()
# print_hiは親クラスClassA,ClassBの両方で定義されている。
# この場合、先に継承したClassAの方が呼ばれる。
#"A hi"と表示

関連記事

Pythonの型ヒント:コレクション型とOptional型の使い方
Pythonの型ヒント:コレクション型とOptional型の…
Python型ヒントについて、変数と関数の引数と戻り値に付与する基本的な書き方について
Python型ヒントについて、変数と関数の引数と戻り値に付与…
【まとめ】よく使うLinuxのショートカット11選
【まとめ】よく使うLinuxのショートカット11選
覚えておくべきLinuxコマンド50選
覚えておくべきLinuxコマンド50選
FlaskでFormを用いてPOSTリクエストを行い、送信された値を取得する
FlaskでFormを用いてPOSTリクエストを行い、送信さ…
Flaskでabortを用いてHTTPException例外を強制的に発生させる
Flaskでabortを用いてHTTPException例外…

Primary Sidebar

人気記事

  • 1
    ITエンジニアとしてスキルを高めるためのUdemy講…
  • 2
    PyCharm,IntelliJのおすすめプラグイン一覧
  • no image 3
    Python未経験だが、フリーランスの案件に採用さ…
  • 4
    アメリカのシリコンバレーでプログラミングを無…

特集記事

  • 1
    Cursorの使用のポイントとコツ(コード補完、イ…
  • 2
    ITエンジニアとしてスキルを高めるためのUdemy講…

目次

1 クラスの継承の基本
2 メソッドのオーバーライド、super()で親クラスのメソッドを呼び出す
3 多重継承の方法
4 関連記事
StartCode ロゴ
AI時代のエンジニアを最速で育てる
法人向けIT研修で即戦力を育成しています。詳しくはお問い合わせください。
▶ 詳細はこちら
Python講座
【Udemy】Python入門講座(0からPythonの基礎を体系的に学んで、生成AIでバイブコーディング)
受講生3000人ほどの人気講座。<strong>Pythonの基礎から生成AI活用</strong>...
詳細 ▶

Footer

利用規約