'How to find out the nested class hierarchy?

I have a python code like this.

File named mymodule.py

class MyBase(object):
    pass

File named data.py

from mymodule import MyBase

class A:
    class NestA(MyBase):
        pass
    class NestB(MyBase):
        pass

class B:
    class NestA(MyBase):
        pass
    class NestB(MyBase):
        pass

if I have a = A.NestA (not it is referring to a class, a is not the object of class NestA but the class itself) how do I find out what nested class hierarchy does a belong to? a.name gives me NestA so that is not a problem. I want to find out what outer class NestA is part of, i.e class A or class B. How do I do it?



Solution 1:[1]

You can use __qualname__ to get the nested class hierarchy,

A.NestA.__qualname__ == 'A.NestA'

Solution 2:[2]

You can do something like this with metaclass programming.

class SetOuterClassType(type):
    def __init__(cls, name, bases, attrs):
        for attrname, attrvalue in attrs.iteritems():
            if getattr(attrvalue, '__set_outerclass__', False):
                attrvalue.__outerclass__ = cls

class OuterClassSetter(object):
    __metaclass__ = SetOuterClassType

class MyBase(object):
    @classmethod
    def fullname(cls):
        if hasattr(cls,'__outerclass__'):
            return '%s.%s' % (
                cls.__outerclass__.__name__, cls.__name__ )
        else:
            return '%s' % cls.__name__


class A(OuterClassSetter):
    class NestA(MyBase):
        __set_outerclass__ = True
    class NestB(MyBase):
        __set_outerclass__ = True


class B(OuterClassSetter):
    class NestA(MyBase):
        __set_outerclass__ = True

    class NestB(MyBase):
        __set_outerclass__ = True

print A.NestA.fullname() # prints 'A.NestA'
print A.NestB.fullname() # prints 'A.NestB'
print B.NestA.fullname() # prints 'B.NestA'
print B.NestB.fullname() # prints 'B.NestB'

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 auxsvr
Solution 2 Matt Anderson