当前位置:  开发笔记 > 编程语言 > 正文

Python内省:如何获得对象属性的"未排序"列表?

如何解决《Python内省:如何获得对象属性的"未排序"列表?》经验,为你挑选了2个好方法。

以下代码

import types
class A:
    class D:
        pass
    class C:
        pass
for d in dir(A):
    if type(eval('A.'+d)) is types.ClassType:
        print d

输出

C
D

如何按照代码中定义这些类的顺序输出?即

D
C

除了使用inspect.getsource(A)并解析之外,还有什么方法吗?



1> Brian..:

请注意,在检查中已经为您完成了解析 - 看一下inspect.findsource,它在模块中搜索类定义并返回源和行号.对该行号进行排序(您可能还需要拆分在单独模块中定义的类)应该给出正确的顺序.

但是,此函数似乎没有记录,只是使用正则表达式来查找行,因此它可能不太可靠.

另一种选择是使用元类或其他方式来隐式或显式地向对象排序信息.例如:

import itertools, operator

next_id = itertools.count().next

class OrderedMeta(type):
    def __init__(cls, name, bases, dct):
        super(OrderedMeta, cls).__init__(name, bases, dct)
        cls._order = next_id()

# Set the default metaclass
__metaclass__ = OrderedMeta

class A:
    class D:
        pass
    class C:
        pass

print sorted([cls for cls in [getattr(A, name) for name in dir(A)] 
           if isinstance(cls, OrderedMeta)], key=operator.attrgetter("_order"))

然而,这是一个相当干扰的变化(需要将您感兴趣的任何类的元类设置为OrderedMeta)



2> zweiterlinde..:

不,您无法按照您要查找的顺序获取这些属性.Python属性存储在dict(read:hashmap)中,它不知道插入顺序.

另外,我会通过简单地说避免使用eval

if type(getattr(A, d)) is types.ClassType:
    print d

在你的循环中.请注意,您也可以只迭代键/值对A.__dict__

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有