Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按继承深度对Python类列表进行排序?_Python_Class_Oop_Method Resolution Order - Fatal编程技术网

如何按继承深度对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

我如何在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'>]
[]
[]
[]
[, ]
只需按
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]