下面的代码

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)和解析的?

的其它任何方式
有帮助吗?

解决方案

inspect模块还具有findsource功能。它返回该对象定义的源极线和行号的元组。

>>> import inspect
>>> import StringIO
>>> inspect.findsource(StringIO.StringIO)[1]
41
>>>

findsource函数实际上搜索波谷源文件,并且如果它被赋予一个类对象查找可能的候选。

给定一个方法 - ,功能 - ,traceback-,帧 - ,或代码对象,它只是着眼于(包含)的代码对象的属性co_firstlineno

其他提示

注意,解析已经完成了你在检查 - 看看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任何类的元类)

没有,你不能在你正在寻找的顺序的属性。蟒属性被存储在一个字典(读:散列映射),它没有插入顺序的认识。

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

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

在你的循环。请注意,您还可以通过刚刚键/值对迭代中A.__dict__

AFAIK,不 - 没有*。这是因为所有类的属性都存储在一个字典(这是,如你所知,无序的)。

*:它实际上可能是可能的,但这需要无论是装饰或可能是黑客元类。无论是做那些感兴趣的吗?

我并不想成为油嘴滑舌这里,但它是可行的,你在你的源组织类的字母顺序?我发现,当有很多类在一个文件中这可能是在自己的权利是有用的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top