2015-02-02 7 views
0

Python iterating through object attributesПеребор элементов в объектах

я нашел этот вопрос при попытке понять итерации над объектами, и нашел этот ответ от Эрик Лещинского:

class C: 
    a = 5 
    b = [1,2,3] 
    def foobar(): 
     b = "hi" 

c = C 

for attr, value in c.__dict__.iteritems(): 
    print "Attribute: " + str(attr or "") 
    print "Value: " + str(value or "") 

который произвел текст, который перечислял все атрибуты класса C , включая функции и скрытые атрибуты (в окружении подчеркивания), как показано ниже:

python test.py 
Attribute: a 
Value: 5 
Attribute: foobar 
Value: <function foobar at 0x7fe74f8bfc08> 
Attribute: __module__ 
Value: __main__ 
Attribute: b 
Value: [1, 2, 3] 
Attribute: __doc__ 
Value: 

Теперь, я и как отфильтровать «скрытые» атрибуты из моей итерации, но есть ли способ отфильтровать все функции? Фактически, я ищу, в классе C, только атрибуты a и b, перечисленные последовательно, без __module__ и __doc__ информации и без каких-либо функций, которые находятся в C.

+0

https://docs.python.org/2/library/functions.html#callable – Jasper

+0

если вызываемый (атрибут) – dylrei

+0

возможный дубликат [Получение атрибутов класса] (http://stackoverflow.com/questions/9058305/getting-attributes-of-a-class) – Kasramvd

ответ

2

Вам придется фильтровать по типу; function объекты - это атрибуты, как и остальные. Вы можете использовать inspect.isfunction() predicate function здесь:

import inspect 

for name, value in vars(C).iteritems(): 
    if inspect.isfunction(value): 
     continue 
    if name[:2] + name[-2:] == '____': 
     continue 

Вы можете использовать inspect.getmembers() function с пользовательским предикатом:

isnotfunction = lambda o: not inspect.isfunction(o) 
for name, value in inspect.getmembers(C, isnotfunction): 
    if name[:2] + name[-2:] == '____': 
     continue 
+0

Спасибо за ответ! Я не знаком с пользовательскими предикатами, но не мог ли пользовательский предикат также использоваться для фильтрации скрытых атрибутов? Что-то по строкам 'isnotfunctionorhidden = lambda o: not inspect.isfunction (o) и o.name [: 2] + o.name [-2:]! = '____'' – Humus

+0

@Humus: имя не передается к функции предиката, только значение. –

+0

Итак, 'o', переданный в лямбда-функцию, не является указателем на проверяемый элемент? – Humus

Смежные вопросы