是否有一个标准函数来迭代基类?

时间:2010-11-04 07:25:50

标签: python

我希望能够迭代给定类的所有基类,包括类本身的直接和间接类。如果您有一个元类来检查其所有基础的内部Options类,这将非常有用。

为此,我写了以下内容:

def bases(cls):
    yield cls
    for direct_base in cls.__bases__:
        for base in bases(direct_base):
            yield base

我有这个标准功能吗?

3 个答案:

答案 0 :(得分:13)

在方法分辨率顺序(MRO)中,有一种方法可以全部返回它们:inspect.getmro。见这里:

http://docs.python.org/library/inspect.html#inspect.getmro

它将它们作为元组返回,然后您可以在一个循环中迭代:

import inspect
for base_class in inspect.getmro(foo):
    # do something

这样做的另一个好处是,即使你有钻石图案的继承,也只会产生一次基类。

答案 1 :(得分:1)

Amber对现实世界有正确的答案,但我会展示一种正确的方法来做到这一点。如果两个基类本身继承自同一个基类,那么您的解决方案将包括两个类。

def bases(cls):
    classes = [cls]
    i = 0
    while 1:
        try:
            cls = classes[i]
        except IndexError:
            return classes
        i += 1
        classes[i:i] = [base for base in cls.__bases__ if base not in classes] 

唯一有点棘手的部分是我们使用切片的地方。在不使用递归的情况下执行此类深度优先搜索是必要的。它所做的只是获取当前正在检查的类的基类,并在它之后立即插入它们,以便第一个基类是下一个检查的类。在标准库中inspect.getmro的实现中提供了一个非常易读的解决方案(它有自己的丑陋)。

答案 2 :(得分:0)

我不确切知道您是否正在寻找,但请查看someclass.__mro__,mro是方法解析订单

http://docs.python.org/library/stdtypes.html?highlight=mro#class.__mro__