如何在 Python 中对类列表进行排序,确保任何子类在列表中的任何父类之前?
我问是因为我想从类型列表中查看一个对象属于什么类型,但如果它属于多个,则找到最具体的类型。
如何在 Python 中对类列表进行排序,确保任何子类在列表中的任何父类之前?
我问是因为我想从类型列表中查看一个对象属于什么类型,但如果它属于多个,则找到最具体的类型。
只需按len(cls.mro())
.
ifC2
是 的子类C1
,它必须持有那个len(C1.mro()) < len(C2.mro())
(因为每个类C1.mro()
也必须出现在 中C2.mro()
)。因此,您可以简单地按mro 列表的长度排序:
class A(object): pass
class X(object): pass
class B(A, X): pass
class C(B): pass
class D(C): pass
sorted([B, C, A, D, X], key = lambda cls: len(cls.mro()))
=> [__main__.A, __main__.X, __main__.B, __main__.C, __main__.D]
为了也支持旧式类,您可以替换cls.mro()
为inspect.getmro(cls)
.
更好的方法是使用一个集合,然后沿着目标类的继承树移动。
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'>]