[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
関数を利用したほうがいいです。