How to get the parents of a Python class?

PythonOop

Python Problem Overview


How can I get the parent class(es) of a Python class?

Python Solutions


Solution 1 - Python

Use the following attribute:

cls.__bases__

From the docs:

> The tuple of base classes of a class > object.

Example:

>>> str.__bases__
(<type 'basestring'>,)

Another example:

>>> class A(object):
...   pass
... 
>>> class B(object):
...   pass
... 
>>> class C(A, B):
...   pass
... 
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)

Solution 2 - Python

If you want all the ancestors rather than just the immediate ones, use inspect.getmro:

import inspect
print inspect.getmro(cls)

Usefully, this gives you all ancestor classes in the "method resolution order" -- i.e. the order in which the ancestors will be checked when resolving a method (or, actually, any other attribute -- methods and other attributes live in the same namespace in Python, after all;-).

Solution 3 - Python

The fastest way to get all parents, and in order, is to just use the __mro__ built-in.

For instance, repr(YOUR_CLASS.__mro__).

The following:

import getpass
getpass.GetPassWarning.__mro__

...outputs, in order:

> (<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>, <type 'exceptions.Warning'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)

There you have it. The "best" answer may have more votes but this is so much simpler than some convoluted for loop, looking into __bases__ one class at a time, not to mention when a class extends two or more parent classes. Importing and using inspect just clouds the scope unnecessarily.

Solution 4 - Python

New-style classes have an mro method you can call which returns a list of parent classes in method resolution order.

Solution 5 - Python

Use bases if you just want to get the parents, use __mro__ (as pointed out by @naught101) for getting the method resolution order (so to know in which order the init's were executed).

Bases (and first getting the class for an existing object):

>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)

For mro in recent Python versions:

>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)

Obviously, when you already have a class definition, you can just call __mro__ on that directly:

>>> class A(): pass
>>> A.__mro__
(__main__.A, object)

Solution 6 - Python

If you want to ensure they all get called, use super at all levels.

Solution 7 - Python

This funciton will print the all the classes of an object, while in each step the next object will the left most parent.

def print_root_left(class_):
    while True:
      print(class_)
      # Check there if are no bases then we have reached the root class
      if not class_.__bases__:
        break
      class_=class_.__bases__[0] # use the left most parent


example = "hello" 
print_root_left(example.__class__)

Solution 8 - Python

I've already answered this once, but you could also use "pip3 install pytis" and use/take a look at, the "getip" program, written in Python.

You may find it's code here: https://github.com/PyTis/PyTis/blob/development/src/pytis/getip.py

I'm the author of the linked repository.

Solution 9 - Python

If you have a variable and want to get its class and parent classes use type() method which will give class for a variable

val="happy coding"
print(type(val).__mro__)

Output:

(<class 'str'>, <class 'object'>)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohn SmithView Question on Stackoverflow
Solution 1 - PythonAyman HouriehView Answer on Stackoverflow
Solution 2 - PythonAlex MartelliView Answer on Stackoverflow
Solution 3 - PythonPyTisView Answer on Stackoverflow
Solution 4 - PythonDasIchView Answer on Stackoverflow
Solution 5 - PythonPascalVKootenView Answer on Stackoverflow
Solution 6 - PythonMike GrahamView Answer on Stackoverflow
Solution 7 - PythonGhassan MaslamaniView Answer on Stackoverflow
Solution 8 - PythonPyTisView Answer on Stackoverflow
Solution 9 - PythonUdesh RanjanView Answer on Stackoverflow