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

BクラスがAクラスを継承している図
クラスを継承すると、プロパティとメソッドが引き継がれる。
継承元のクラスを子クラス、継承先のクラスを親クラスと言う
この際、_(アンダースコア)が2つのプライベートプロパティ、プライベートメソッドは継承先で利用できない

クラスを継承する場合は、以下のようにclass クラス名(継承元クラス):とする
継承先を指定しないとき、Objectクラスを継承したことになる。
class BaseClass:
# 継承元クラス
class DerivedClass(BaseClass):
# 継承先クラス
では、実際にクラスの継承を事例を見てみましょう。
- コンストラクタの定義
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
- 継承先で新たにメソッドを定義する
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()で親クラスのメソッドを呼び出す
子クラスで親クラスの持っているメソッドを書き換えることをオーバーライドと言う。
この場合、子クラスからはオーバーライドしたメソッドが呼び出される。
- メソッドのオーバーライド
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を継承
また、この際親クラスのメソッドを呼び出す場合には、親クラス名.メソッド名(引数)とする。
以下、例を示す。(親クラスの初期化についても記載)
- クラスの多重継承
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"と表示