2013-06-11 1 views
4

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

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

Однако я не известно ни об одном решении перечислить все вызываемые члены, которые определены в моем классе (смотрите, например, здесь: Finding what methods an object has), я добавил это простое улучшение, которые исключают __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?

+0

Это решение выглядит довольно элегантно для меня, это производительность не соответствует вашим потребностям? в противном случае, я бы сказал, придерживайтесь этого. – coder543

+0

@ coder543, у меня нет проблем с производительностью. Я просто задавался вопросом, был ли мой поиск «Python Zen» ;-) – Oz123

ответ

2

Поскольку никто еще не предложил лучшее решение, я думаю, как Pythonic бы с STL Пайтона:

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

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