How to get the parents of a Python class?

后端 未结 6 1808
野趣味
野趣味 2020-11-28 03:49

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

相关标签:
6条回答
  • 2020-11-28 04:30

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

    0 讨论(0)
  • 2020-11-28 04:33

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

    0 讨论(0)
  • 2020-11-28 04:36

    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)
    
    0 讨论(0)
  • 2020-11-28 04:40

    The FASTEST way, to see all parents, and IN ORDER, just use the built in __mro__

    i.e. repr(YOUR_CLASS.__mro__)


    >>>
    >>>
    >>> 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 right now, has 182 votes (as I am typing this) 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. It honestly is a shame people don't know to just use the built-ins

    I Hope this Helps!

    0 讨论(0)
  • 2020-11-28 04:49

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

    0 讨论(0)
  • 2020-11-28 04:52

    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'>)
    
    0 讨论(0)
提交回复
热议问题