[Python] クラスの継承関係を確認する

Pythonでクラスの継承関係を確認する方法のメモ。

Pythonでクラスの継承関係を確認する方法は大きく分けると二つくらいになると思います。

  • issubclass関数
  • mroメソッド

issubclass

組み込み関数issubclassを利用すると、第一引数に渡されたクラスが第二引数のサブクラスかどうかを判定してくれます。

class A:
    pass

class B(A):
    pass

class C(B):
    pass

class D:
    pass


issubclass(B, A) #  True

issubclass(C, A) # True

issubclass(D, A) #  False

issubclass(A, A) #  True

CAのように直接の親子関係がなくても(先祖/子孫関係にあれば)、Trueを返してくれます。

同じクラスを引数に取った場合でもTrueを返します。

mro

Method Resolution Order (メソッド名前解決順序)の略だそうです。
mroメソッドは、呼び出したクラスの祖先クラスを名前解決を行う順番のリストで返してくれます。

class Dog:
    pass

class Chihuahua(Dog):
    pass

class Poodle(Dog):
    pass

class ChihuaPoo(Chihuahua,Poodle):
    pass

ChihuaPoo.mro()
# [<class '__main__.ChihuaPoo'>, <class '__main__.Chihuahua'>, <class '__main__.Poodle'>, <class '__main__.Dog'>, <class 'object'>]

この場合だと、同名のメソッドが定義されていた際、リストの先頭から順に優先的に利用されることを表します。

ミックスインクラスを多用した設計で思う通りに実行できないときは、morメソッドを利用して名前解決の順番を確認してみると良いかもしれません。

おまけ

Dog in ChihuaPoo.mro()

などとしても、issubclassと同じ結果が得られます。

見づらいので普通はissubclass関数を利用したほうがいいです。