Python的自省:如何获得对象属性的“未分类”列表?
-
11-07-2019 - |
题
下面的代码
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,不 - 没有*。这是因为所有类的属性都存储在一个字典(这是,如你所知,无序的)。
*:它实际上可能是可能的,但这需要无论是装饰或可能是黑客元类。无论是做那些感兴趣的吗?
我并不想成为油嘴滑舌这里,但它是可行的,你在你的源组织类的字母顺序?我发现,当有很多类在一个文件中这可能是在自己的权利是有用的。
不隶属于 StackOverflow