0. はじめに
クラスを継承後、サブクラスでメソッドをオーバーライドする。この時スーパークラスのメソッドはどうなっているだろうか。
上記の疑問を解決すると同時に、クラスの定義、クラスメソッドとインスタンスメソッド、継承とオーバーライドをまとめる。
1. クラスの定義
Pythonではclass クラス名
でクラスを定義することができる。
class SuperClass:
2. クラス変数とクラスメソッド
クラス変数は変数名 = 値
で定義が可能だが、クラスメソッドを作成する際はdef宣言の前に@classmethod
とメソッドがクラスメソッドであることを宣言する必要がある。
また、引数としてcls
を渡し、クラス変数はcls.変数名
で呼び出すことが可能だ。
count = 0 #クラス変数の定義
@classmethod #クラスメソッドの定義
def ClassMethod(cls):
cls.count += 1
return cls.count
3. インスタンスメソッド
インスタンスメソッドはdef __init__(self)
内にself.変数名 = 値
で定義し、呼び出す際もself.変数名
で呼び出す。
インスタンスメソッドはdef メソッド名(self)
で定義が可能である。
def __init__(self, i): #インスタンス変数の定義
self.count = 0
self.i = i
def InstanceMethod(self): #インスタンスメソッドの定義
self.count += self.i
return self.count
4. 継承
クラスを継承する際はclass クラス名(スーパークラス名)
とすることでスーパークラスの継承が可能だ。
また、スーパークラスのインスタンス変数をそのまま使用したい場合は、super().__init__(変数名)
で継承される。
class SubClass(SuperClass):
def __init__(self, i):
super().__init__(i) #スーパークラス変数の継承
self.count()
5. オーバーライド
スーパークラスのインスタンスメソッドをオーバーライドすることも可能だ。オーバーライドする際はdef メソッド名(self)
の後に新しい処理を記述すれば良い。
def InstanceMethod(self):
self.count += self.i + 1
return self.count
6. 実行して比較
上記で作成したクラスを実際に使ってみよう。今回はクラスメソッド、スーパークラスのインスタンスメソッド、サブクラスのインスタンスメソッドすべてを5回呼び出し値を比べてみる。なお、サブクラスでオーバーライドしたメソッドはスーパークラスではどうなっているのか確認するため、サブクラスのメソッドを先に呼び出している。
SubInstance = SubClass(1) #Class2のインスタンス作成
SuperInstance = SuperClass(1) #SuperClassのインスタンス作成
c = [] #クラスメソッド用リスト
i1 = [] #SuperClassのインスタンスメソッド用リスト
i2 = [] #SubClassのインスタンスメソッド用リスト
for _ in range(5):
c.append(SuperClass.ClassMethod())
i2.append(SubInstance.InstanceMethod())
i1.append(SuperInstance.InstanceMethod())
print(c, i1, i2)
[1, 2, 3, 4, 5][1, 2, 3, 4, 5][2, 4, 6, 8, 10]
7. まとめ
継承したクラスのインスタンスメソッドを先に作成し実行しても継承前のインスタンスメソッドの実行結果は作成通りの挙動をする。つまりメソッドをオーバーライドしてもスーパークラスのメソッドは上書きされていないことがわかる。