Python: есть ли способ рефлексивно перечислить все атрибуты класса - PullRequest
4 голосов
/ 10 апреля 2010

Учитывая класс, такой как

class MyClass:
    text = "hello"
    number = 123

Есть ли в python способ проверить MyClass на наличие двух атрибутов text и number. Я не могу использовать что-то вроде inspect.getSource(object), потому что класс, для которого я получаю его атрибуты, генерируется с помощью SWIG (поэтому они скрыты в .so :)).

Так что я действительно ищу что-то эквивалентное Java [Class.getDeclardFields][1]

Буду признателен за любую помощь, в противном случае мне придется решать эту проблему с SWIG + JAVA вместо SWIG + Python.

Ответы [ 3 ]

8 голосов
/ 10 апреля 2010

Я обычно просто использую dir(MyClass). Работает и с объектами-экземплярами.

редактирование: Я должен упомянуть, что это сокращенная функция, которую я использую для выяснения, правильно ли создаются мои объекты. Возможно, вы захотите более внимательно изучить API отражения, если вы делаете это программно.

Также может не работать на связанных библиотеках.

0 голосов
/ 10 апреля 2010
>>> 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>

способен dir и

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)

динамически загружается

0 голосов
/ 10 апреля 2010

Пожалуйста, напишите фактические, исполняемые фрагменты кода; не ожидайте, что люди, отвечающие на ваш вопрос, сначала исправят ваш код.

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

for a in dir(MyClass):
    print a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...