Python のお勉強8 ( クラスの継承 )
「Python のお勉強シリーズ」第8回目は、クラスの継承についてサンプルコード書いてみました。
■ Inherit1.py
#coding: cp932 class Parent: val = "val" def __init__(self): print("Parent __init__") def test1(self): print("test1") print("self:", self) def test2(self): print("test2") print("self:", self) @staticmethod def staticMethod(): print("staticMethod") @classmethod def classMethod(cls): print("classMethod") print("cls:", cls) class Child(Parent): def __init__(self): super().__init__() #super() を使って Parent の __init__ の呼び出し print("Chile __init__") #test2 をオーバーライド def test2(self): print("override") print("self:", self) if __name__ == "__main__": print("----- create Child instance -----") instance = Child() print("----- instance.val -----") print(instance.val) #クラス変数にアクセス可能 print("----- call test1 -----") instance.test1() #self は Child のインスタンスになる print("----- call test2 -----") instance.test2() #オーバーライドしているので Child の test2 が呼ばれる print("----- call staticMehod -----") Child.staticMethod() #親クラスのスタティックメソッド呼び出せる #instance.staticMethod() #インスタンスからも呼び出し可能 print("----- call classMethod -----") Child.classMethod() #親クラスのクラスメソッドも呼び出せる、cls は Child になる #instance.classMethod() #インスタンスからも呼び出し可能 print("----- isinstance(), iscubclass() -----") #組み込み関数 isinstance(), issubclass() を使うと継承関係が調べられる print("isinstance(instance, Parent):", isinstance(instance, Parent)) #True print("issubclass(Child, Parent):", issubclass(Child, Parent)) #True
■ 実行結果
----- create Child instance ----- Parent __init__ Chile __init__ ----- instance.val ----- val ----- call test1 ----- test1 self: <__main__.Child object at 0x00130F70> ----- call test2 ----- override self: <__main__.Child object at 0x00130F70> ----- call staticMehod ----- staticMethod ----- call classMethod ----- classMethod cls: <class '__main__.Child'> ----- isinstance(), iscubclass() ----- isinstance(instance, Parent): True issubclass(Child, Parent): True
<クラス名>(親クラス名): とクラスを宣言することでクラスの継承が可能です。メソッドについては、スタティックメソッド / クラスメソッドも呼び出せるみたいです。
親クラスのメソッドとか呼び出したい場合は super() で。
クラスの継承関係なんかは、組み込み関数 isinstance(), iscubclass() で調べられる。
で、Python では多重継承可能みたいです。以下みたいな感じで。
■ Inherit2.py
#coding: cp932 class Parent1: def p1(self): print("p1") class Parent2: def p2(self): print("p2") class Child(Parent1, Parent2): pass if __name__ == "__main__": instance = Child() instance.p1() instance.p2()
■ 実行結果
p1 p2
以上です。