在Python 3中获取所有的超类

32

如何在Python中获取给定类的所有父类列表?

我知道,有一个__subclasses__()方法可以在inspent模块中获取所有子类,但是我不知道是否有类似的方法可以获取父类。

2个回答

44

使用 __mro__ 属性:

>>> class A:
...     pass
...
>>> class B:
...     pass
...
>>> class C(A, B):
...     pass
...
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

这是在类实例化时填充的特殊属性:

class.__mro__ 这个属性是一个类元组,当查找方法分辨顺序中的基类时将其考虑在内。

class.mro() 这个方法可以被元类覆盖以自定义其实例的方法解析顺序。它在类实例化时被调用,并且它的结果被存储在 __mro__ 中。


谢谢。这个方法和__mro__字段有什么区别?如果我使用__mro__,这个方法是更好的选择吗? - VeLKerr
1
谢谢。因此,最好使用__mro__,因为它已经具有mro()的结果,该结果在类实例化时调用。因此,我不需要再次调用mro() - VeLKerr
@VeLKerr 这不太可能有太大的影响! - jonrsharpe

0

以下是两种适用于 Python 2 和 3 的方法。

参数可以是实例或类。

import inspect

# Works both for python 2 and 3
def getClassName(anObject):    
    if (inspect.isclass(anObject) == False): anObject = anObject.__class__
    className = anObject.__name__
    return className

# Works both for python 2 and 3
def getSuperClassNames(anObject):
    superClassNames = []
    if (inspect.isclass(anObject) == False): anObject = anObject.__class__
    classes = inspect.getmro(anObject)
    for cl in classes:
        s = str(cl).replace('\'', '').replace('>', '')
        if ("__main__." in s): superClassNames.append(s.split('.', 1)[1])
    clName = str(anObject.__name__)
    if (clName in superClassNames): superClassNames.remove(clName)
    if (len(superClassNames) == 0): superClassNames = None
    return superClassNames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接