Reputation: 3157
How I can get a list with all superclasses of given class in Python?
I know, there is a __subclasses__()
method in inspent
module for getting all subclasses, but I don't know any similar method for getting superclasses.
Upvotes: 35
Views: 16648
Reputation: 122026
Use the __mro__
attribute:
>>> class A:
... pass
...
>>> class B:
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
This is a special attribute populated at class instantiation time:
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__
.
Upvotes: 48
Reputation: 944
Here's 2 methods which work both for python 2 and 3.
Argument can be an instance or a classe.
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
Upvotes: 0