如何查找嵌套类层次结构?

4

我有一段类似于这样的 Python 代码。

文件名为 mymodule.py。

class MyBase(object):
    pass

名为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

如果我有一个 = A.NestA (它不是指一个类,a不是类NestA的对象,而是类本身),那么我该如何找出a属于哪个嵌套类层次结构?a.name告诉我是NestA,这并不是问题。我想找出NestA所属的外部类,即类A或类B。我该怎么做?
3个回答

1
你可以使用inspect模块来做到这一点:
import inspect

a = A.NestA

print a in [x[1] for x in inspect.getmembers(A, inspect.isclass)]
print a in [x[1] for x in inspect.getmembers(B, inspect.isclass)]

结果:

True
False

补充:

如果您对模块中的类一无所知,可以回溯并获取该模块。

# for each class in a's module...
for klass in inspect.getmembers(inspect.getmodule(a), inspect.isclass):
    # see if a is in that class
    if a in [x[1] for x in inspect.getmembers(klass[1], inspect.isclass)]:
        print a, "is a member of", klass[0]

结果:

__main__.NestA is a member of A

1
您可以使用__qualname__来获取嵌套类层次结构。
A.NestA.__qualname__ == 'A.NestA'

0
你可以用元类编程来做类似这样的事情。
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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接