найти все члены экземпляра в python, за исключением __init__

ключевое слово vars дает мне все переменные в экземпляре, например:

In [245]: vars(a)
Out[245]: {'propa': 0, 'propb': 1}

Однако мне неизвестно единственное решение для перечисления всех вызываемых членов, определенных в моем классе (см., Например, здесь: Поиск методов, которые есть у объекта), я добавил эти простые улучшения, исключающие __init__:

In [244]: [method for method in dir(a) if callable(getattr(a, method)) and not method.startswith('__')]
Out[244]: ['say']

По сравнению с:

In [243]: inspect.getmembers(a)
Out[243]:
[('__class__', __main__.syncher),
 ('__delattr__',
  <method-wrapper '__delattr__' of syncher object at 0xd6d9dd0>),
 ('__dict__', {'propa': 0, 'propb': 1}),
 ('__doc__', None),
 ...snipped ...
 ('__format__', <function __format__>),
 ('__getattribute__',
  <method-wrapper '__getattribute__' of syncher object at 0xd6d9dd0>),
 ('__hash__', <method-wrapper '__hash__' of syncher object at 0xd6d9dd0>),
 ('__init__', <bound method syncher.__init__ of <__main__.syncher object at 0xd6d9dd0>>),
 ('__module__', '__main__'),
 ('__setattr__',
  <method-wrapper '__setattr__' of syncher object at 0xd6d9dd0>),
 ('__weakref__', None),
 ('propa', 0),
 ('propb', 1),
 ('say', <bound method syncher.say of <__main__.syncher object at 0xd6d9dd0>>)]

или например:

In [248]: [method for method in dir(a) if callable(getattr(a, method)) 
                and isinstance(getattr(a, method), types.MethodType)]
Out[248]: ['__init__', 'say']

и я также нашел этот метод, который исключает встроенные подпрограммы:

In [258]: inspect.getmembers(a, predicate=inspect.ismethod)
Out[258]:
[('__init__',
  <bound method syncher.__init__ of <__main__.syncher object at 0xd6d9dd0>>),
 ('say', <bound method syncher.say of <__main__.syncher object at 0xd6d9dd0>>)]

Итак, мой вопрос: есть ли у вас лучший способ найти все методы внутри класса (за исключением __init__ и всех встроенных методов) в Python 2.7.X?


person oz123    schedule 11.06.2013    source источник
comment
Мне это решение кажется довольно элегантным, разве производительность не соответствует вашим потребностям? в противном случае я бы сказал, придерживайтесь этого.   -  person coder543    schedule 13.06.2013
comment
@ coder543, с производительностью проблем нет. Я просто подумал, закончился ли мой поиск Python Zen ;-)   -  person oz123    schedule 13.06.2013


Ответы (1)


Поскольку никто другой не предлагал лучшего решения, я предполагаю, что путь Pythonic будет заключаться в использовании Python STL:

inspect.getmembers(a, predicate=inspect.ismethod)

Чтобы исключить init, можно использовать filter.

person oz123    schedule 28.02.2015