如何按继承深度对Python类列表进行排序?
我如何在Python中对类列表进行排序,确保列表中的任何子类都在其父类之前如何按继承深度对Python类列表进行排序?,python,class,oop,method-resolution-order,Python,Class,Oop,Method Resolution Order,我如何在Python中对类列表进行排序,确保列表中的任何子类都在其父类之前 我之所以问这个问题,是因为我想从类型列表中看到一个对象属于哪种类型,但如果它属于多个类型,就要找到最具体的类型。更好的方法是使用一个集合,然后沿着目标类的继承树移动 def find_parent(target, class_set): if target in class_set: return [target] else: bases = [] for
我之所以问这个问题,是因为我想从类型列表中看到一个对象属于哪种类型,但如果它属于多个类型,就要找到最具体的类型。更好的方法是使用一个集合,然后沿着目标类的继承树移动
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'>]
[]
[]
[]
[, ]
只需按len排序(cls.mro())
如果C2
是C1
的一个子类,它必须持有len(C1.mro())
(因为C1.mro()
中的每个类也必须出现在C2.mro()
中)。因此,您可以简单地按照以下内容的长度进行排序:
为了也支持旧式类,您可以将
cls.mro()
替换为。在排序键函数中使用issubclass
。(通常:sorted(classes,cmp=lambda x,y:1,如果issubclass(x,y)else-1)
)@njzk2:该比较器不一致;没有继承关系的类彼此比较少,而一个类总是比它自己比较大。这只是我头脑中的一个例子,不是一个实际的答案。
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]