Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

【Python・クラス】~クラスを調べる、多重継承~


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20210405111435p:plain

おはようございます。Shotaです。今日も早速、Pythonに関する記事を書いていきます。

今日は、「クラスの調べ方」「多重継承」について詳細に解説していきます。

【目次】

クラスの調べ方

いくつものクラスを作成して利用するようになると。次第に「このインスタンスは何のクラスだったのか」がわからなくなってしまうようになります。typeで調べることができますが、もう一つ、「isinstance」という関数も役に立ちます。インスタンスが指定したクラスのものであるか調べるものです。以下のように呼び出します。

isinstance(instancename, classname)

第一引数にインスタンス、第二引数にクラスを指定します。これで、そのインスタンスが指定のクラスのものかどうかを調べることができます。戻り値はboolで、指定したクラスのインスタンスであるならばTrue、そうでなければFalseを返します。

試しに以下のコードを書いて実行してみましょう。

class Student:
    pass

class Child(Student):
    pass

ob1 = Student()
ob2 = Child()

print(isinstance(ob1, Student))
print(isinstance(ob1, Child))
print(isinstance(ob2, Student))
print(isinstance(ob2, Child))

▼実行結果

True
False
True
True

Studentインスタンスは、Studentクラス=True、Childクラス=Falseとなりました。正しく判断できていることがわかります。ところが、ChildクラスはStudentもChildも両方ともTrueと表示されました。

Childクラスは、Studentクラスを継承しています、つまり、Studentクラスとしての機能は全て持っていることになります。ChildクラスはStudentクラスを更に拡張したものです。よって「Studentクラスの一種」と考えられます。

多重継承

ここまで継承のサンプルをいくつか挙げてきましたが、それらはいずれも一つだけのクラスを継承していました。継承は一つのクラスしかできないわけではありません。Pythonでは、複数のクラスを継承することも可能です。この場合は、クラス名をカンマで区切って記述します。

class classname(cls1, cls2, ...)

これで指定したクラスをすべて継承するクラスを定義します。

実際に多重継承を使ってみましょう。

#多重継承
class DataObj:
    def __init__(self, data):
        self.data = data

class PrintObj(DataObj):
    def show(self):
        print(f'data = {self.data}')

class AddObj(DataObj):
    def __iadd__(self, other):
        self.data += other.data
        return self

class MyObj(PrintObj, AddObj):
    def __init__(self, data):
        self.data = data

ob = MyObj([1, 2, 3])
ob.show()
ob2 = MyObj([4, 5, 6])
ob2.show()
ob += ob2
ob.show() 

▼実行結果

data = [1, 2, 3]
data = [4, 5, 6]
data = [1, 2, 3, 4, 5, 6]

それぞれのクラスの役割は以下の通りです。

f:id:ShotaNukumizu_1000:20210601061251p:plain

MyObjクラスでは、他のクラスすべてを継承することになります。

MyObjインスタンスを2つ作成し、showメソッドでデータを出力しています。そして+=でデータを追加し、再度showメソッドを使います。obインスタンスにob2インスタンスのデータが追加されていることがわかります。

ここでdataインスタンス変数、showメソッド、+=による演算の各機能を3つのクラスに一つずつ実装していきます。そして、それらすべてを継承するMyObjクラスを用意しています、MyObjクラスにすべての機能が組み込まれていることがわかります。

多重継承により、クラスを機能や役割ごとに設計してそれを必要に応じて一つにまとめて利用する、というような使い方が可能になりました。

まとめ

【本日のまとめ】

  • インスタンスが指定したクラスのものであるか調べる関数に、「isinstance」関数がある。

  • クラスでは、()に複数のクラスを用意することで複数クラスを同時に継承できる。(多重継承)