子クラスがリスト内の親クラスの前にあることを確認して、Python でクラスのリストを並べ替えるにはどうすればよいですか?
タイプのリストからオブジェクトが属するタイプを確認したいので質問しますが、複数に属する場合は最も具体的なタイプを見つけます。
子クラスがリスト内の親クラスの前にあることを確認して、Python でクラスのリストを並べ替えるにはどうすればよいですか?
タイプのリストからオブジェクトが属するタイプを確認したいので質問しますが、複数に属する場合は最も具体的なタイプを見つけます。
より良いアプローチは、セットを使用してから、ターゲット クラスの継承ツリーに沿って移動することです。
def find_parent(target, class_set):
if target in class_set:
return [target]
else:
bases = []
for parent in target.__bases__:
result = find_parent(parent, class_set)
if result is not None:
bases.extend(result)
return bases
例:
class A(object):
pass
class B(str):
pass
class C(A):
pass
class D(A, dict):
pass
class_set = {dict, A}
print find_parent(A, class_set)
print find_parent(B, class_set)
print find_parent(C, class_set)
print find_parent(D, class_set)
次の結果が得られます。
[<class '__main__.A'>]
[]
[<class '__main__.A'>]
[<class '__main__.A'>, <type 'dict'>]