[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
CとAのように直接の親子関係がなくても(先祖/子孫関係にあれば)、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関数を利用したほうがいいです。
