gpt4 book ai didi

Python 自省(introspection) : How to get an 'unsorted' list of object attributes?

转载 作者:太空狗 更新时间:2023-10-30 01:42:30 25 4
gpt4 key购买 nike

下面的代码

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 中为您完成 - 查看 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)

关于Python 自省(introspection) : How to get an 'unsorted' list of object attributes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/640479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com