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


以上です。

[ 環境情報 ]
Windows 7 SP1
Python 3.4.3