How to get the parents of a Python class?

Question:

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

Asked By: John Smith

||

Answers:

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'>)
Answered By: Ayman Hourieh

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;-).

Answered By: Alex Martelli

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

Answered By: Mike Graham

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

Answered By: DasIch

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)
Answered By: PascalVKooten

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.

Answered By: PyTis

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__)
Answered By: Ghassan Maslamani

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.

Answered By: PyTis

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'>)
Answered By: Udesh Ranjan
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.