Python: 有没有方法可以反射列出类的所有属性

4 投票
3 回答
2669 浏览
提问于 2025-04-15 21:26

假设我们有一个这样的类:

class MyClass:
    text = "hello"
    number = 123

在Python中,有没有办法检查一下MyClass,看看它是否有两个属性:textnumber?我不能使用像inspect.getSource(object)这样的东西,因为我需要获取属性的类是通过SWIG生成的(所以它们隐藏在.so文件里 :))。

所以我其实是在寻找一个类似于Java的[Class.getDeclaredFields][1]的方法。

如果有人能帮忙就太好了,不然我就得用SWIG + JAVA来解决这个问题,而不是SWIG + Python。

3 个回答

-1

请提供可以直接运行的代码片段,不要指望别人回答你的问题之前先帮你修正代码。

class MyClass(object):
    text = "hello"
    number = 123

for a in dir(MyClass):
    print a
0
>>> import cmath
>>> dir(cmath)
['__doc__', '__file__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'isinf', 'isnan', 'log', 'log10', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
>>> cmath.atan
<built-in function atan>
open("/usr/lib/python2.6/lib-dynload/cmath.so", O_RDONLY) = 4
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\17\0\0004\0\0\0"..., 512) = 512
fstat64(4, {st_mode=S_IFREG|0644, st_size=32176, ...}) = 0
mmap2(NULL, 43824, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x268000
mmap2(0x26f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x6) = 0x26f000
mmap2(0x271000, 6960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x271000
close(4)

是可以用dir来查看的,并且

是动态加载的

8

我通常只用 dir(MyClass) 这个命令。这个方法在实例化的对象上也能用。

补充说明:我应该提一下,这其实是我用来检查我的对象是否正确创建的一个简便方法。如果你是想通过程序来做这件事,可能需要更仔细地研究一下反射API。

另外,这个方法可能在链接的库上不太好用。

撰写回答