【问题标题】:How to enumerate nested classes in python?如何枚举python中的嵌套类?
【发布时间】:2016-03-31 02:10:58
【问题描述】:

如何实现枚举嵌套类的函数?

class A(object):
    class B(object):
        pass

    class C(object):
        pass


def enumerate_nested_classes(_class):
    return ()  # need proper implementation instead


assert set(enumerate_nested_classes(A)) == {A.B, A.C}

【问题讨论】:

  • 需要递归吗?
  • 你真正想要达到什么目标?!

标签: python nested inner-classes


【解决方案1】:

inspect.getmembers()inspect.isclass() 一起使用应该会有所帮助:

classes = [name for name, member_type in inspect.getmembers(A)
           if inspect.isclass(member_type) and not name.startswith("__")]

print(classes)  # prints ['B', 'C']

请注意,not name.startswith("__") 需要检查以排除 __class__ - 我怀疑有一种更简单、更 Pythonic 的方法可以做到这一点,如果有人指出这一点将不胜感激。

【讨论】:

  • 输出应该是[getattr(A, name) for name in classes]。另外我不相信这会进一步嵌套..
  • @wim 谢谢,是的,目前这不是递归的,让我们看看 OP 是否需要更深入。
【解决方案2】:

你可以使用下面的代码:

import types


class A(object):
    class B(object):
        pass

    class C(object):
        pass

def enumerate_nested_classes(_class):
    return [getattr(_class, n) for n in dir(_class) if not n.startswith('__')
            and isinstance(getattr(_class, n), (type, types.ClassType))] 

assert enumerate_nested_classes(A) == [A.B, A.C]

print enumerate_nested_classes(A) 打印[<class '__main__.B'>, <class '__main__.C'>]

注意。 dir(_class) 结果列表按字母顺序排序,因此在使用 assert enumerate_nested_classes(A) == [A.B, A.C] 时最好使用:assert sorted(enumerate_nested_classes(A)) == sorted([A.B, A.C])

【讨论】:

  • 它非常简单,即使不导入 inspect 也能正常工作。另一个变种:(n for n in (getattr(_class, n) for n in dir(_class) if not n.startswith('__')) if isinstance(n, (type, types.ClassType)))
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 2011-12-14
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多