在 Python 3 中获取所有超类

Posted

技术标签:

【中文标题】在 Python 3 中获取所有超类【英文标题】:Getting all superclasses in Python 3 【发布时间】:2015-09-10 18:06:57 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

使用__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'>)

这是在类实例化时填充的special attribute:

class.__mro__ 这个属性是一个类的元组,它们是 在方法解析期间查找基类时考虑。

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

【讨论】:

谢谢。这个方法和__mro__字段有什么区别?如果我使用__mro__ 这样会更好吗? 谢谢。因此,最好使用__mro__,因为它已经有mro() 的结果,它在类实例化时调用。所以,我不需要再打电话给mro() @VeLKerr 不太可能有太大的不同!【参考方案2】:

这里有 2 种适用于 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

【讨论】:

以上是关于在 Python 3 中获取所有超类的主要内容,如果未能解决你的问题,请参考以下文章

Python DB API的异常

如何访问 Python 超类的属性,例如通过 __class__.__dict__?

python继承简介

Object:所有类的超类

在Python 3中,超类可以多态地调用子类的构造函数

有没有办法修改子类,以便所有超类继承更改?