在 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 中获取所有超类的主要内容,如果未能解决你的问题,请参考以下文章