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

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

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

【问题讨论】:

    标签: python python-3.x inheritance superclass


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 2015-04-21
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2012-08-20
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多