获取 Python 中的所有超类 3
Getting all superclasses in Python 3
我怎样才能得到一个包含 Python 中给定 class 的所有 superclasses 的列表?
我知道,在inspent
模块中有一个__subclasses__()
方法来获取所有子classes,但我不知道任何类似的方法来获取superclasses.
使用__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 实例化时填充的 special attribute:
class.__mro__
This attribute is a tuple of classes that are
considered when looking for base classes during method resolution.
class.mro()
This method can be overridden by a metaclass to
customize the method resolution order for its instances. It is called
at class instantiation, and its result is stored in __mro__
.
这里有 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 中给定 class 的所有 superclasses 的列表?
我知道,在inspent
模块中有一个__subclasses__()
方法来获取所有子classes,但我不知道任何类似的方法来获取superclasses.
使用__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 实例化时填充的 special attribute:
class.__mro__
This attribute is a tuple of classes that are considered when looking for base classes during method resolution.
class.mro()
This method can be overridden by a metaclass to customize the method resolution order for its instances. It is called at class instantiation, and its result is stored in__mro__
.
这里有 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