我希望能够迭代给定类的所有基类,包括类本身的直接和间接类。如果您有一个元类来检查其所有基础的内部Options类,这将非常有用。
为此,我写了以下内容:
def bases(cls):
yield cls
for direct_base in cls.__bases__:
for base in bases(direct_base):
yield base
我有这个标准功能吗?
答案 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__