Найти - Пользователи
Полная версия: перебор членов класса
Начало » Python для новичков » перебор членов класса
1 2
pupkin2
подскажите.
есть класс. нужно перебрать все его члены. как такое реализовывается?

второй вопрос: для определения типа при переборе, достаточно использовать: “type(iter) == need_type” ?

спасибо.
d1ffuz0r
перебрать - просто вывести или вызвать? ну м.б. такими велосипедами, самому интересно как красивей это сделать
если вывести то можно
>>>import re
>>> filter(lambda item: not item.startswith('_'), re.__dict__)
['finditer', 'sre_compile', 'LOCALE', 'escape', 'DEBUG', 'X', 'subn', 'findall', 'DOTALL', 'purge', 'sub', 'copy_reg', 'I', 'split', 'UNICODE', 'match', 'template', 'M', 'L', 'IGNORECASE', 'S', 'U', 'T', 'MULTILINE', 'Scanner', 'sys', 'search', 'VERBOSE', 'compile', 'TEMPLATE', 'error', 'sre_parse']
если вызвать:
>>>class T(object):
def first():
print "first"
def two():
print "two"

>>> for c in T.__dict__:
if not c.startswith('_'):
T.__dict__.get(c)()
two
first

>>> map(lambda i: T.__dict__.get(i)() if not i.startswith('_') else None, T.__dict__)
two
first
pupkin2
d1ffuz0r
просто вывести или вызвать?
нужно перебрать все члены являющиеся строками, и произвести над ними некоторое действие.

да, первый способ подходит.
спасибо.
doza_and
pupkin2
есть класс
наверное имеется ввиду объект класса.
pupkin2
да, первый способ подходит
- не факт. При таком способе вы потеряете строки которые являются свойствами объекта и строки являющиеся статическими строками в классе. И те и другие и третьи (которые вы получите из __dict__) в коде выглядят
идентично
class Ta(object):
a="asdas"
b=u"qeqwe"
@property
def c(self):
return "ccc"
def __init__(self):
self.d="asdas"
x=Ta()
print [x.a,x.b,x.c,x.d]
pupkin2
нужно перебрать все члены являющиеся строками
- а кто такие строки? в 2.x как в примере выше - unicode и обычные строки это разные вещи. можно проверить отдельно: isinstance('hello', str),isinstance(“asd”,unicode)
Или вместе:
isinstance(u“asd”,basestring)
pupkin2
doza_and
наверное имеется ввиду объект класса.
какой смысл употреблять “объект” в ЯП, в котором невозможно метапрограммирование? ;)

doza_and
При таком способе вы потеряете строки которые являются свойствами объекта и строки являющиеся статическими строками в классе.
меня интересуют только мною объявленные члены.

doza_and
а кто такие строки?
в пайтоновской терминологии пока не силен. неделю как изучаю.

подразумевал следующее:
class myclass:
def __init__(self):
self.a = "a"
self.b = "b"
doza_and
При необходимости перебора наверное имеет смысл один раз написать универсальный переборщик, и потом его использовать. Например чтото такое:
def ObjectIterator(obj,root="",level=None):
"""итерирование подобъектов для данного объекта ! только для древовидных объектов - не проверяю циклические ссылки!
>>> class Ta:
>>> def __init__(self):
>>> self.a={"a":1,"b":2}
>>> self.b=range(5)
>>> for i,v in ObjectIterator([Ta(),1,2,3,[4,{"a":1,"b":2}],5,"asd"],"xxx"):
>>> print i,v
xxx[0].a[a] 1
xxx[0].a[b] 2
xxx[0].b[0] 0
xxx[0].b[1] 1
xxx[0].b[2] 2
xxx[0].b[3] 3
xxx[0].b[4] 4
xxx[1] 1
xxx[2] 2
xxx[3] 3
xxx[4][0] 4
xxx[4][1][a] 1
xxx[4][1][b] 2
xxx[5] 5
xxx[6] asd
"""
if not level is None:
if level==-1:return
level-=1
if hasattr(obj,"iteritems"): # словари
for key,val in obj.iteritems():
for k1,v1 in ObjectIterator(val,"{root}[{key}]".format(key=key,root=root),level=level):
yield k1,v1
elif hasattr(obj,"__iter__"): # списки те объекты с произвольным доступом
for key,val in enumerate(obj):
for k1,v1 in ObjectIterator(val,"{root}[{key}]".format(key=key,root=root),level=level):
yield k1,v1
elif hasattr(obj,"__dict__") or hasattr(obj,"_fields_"): #классы
if hasattr(obj,"__dict__"):
for key,val in obj.__dict__.iteritems():
for k1,v1 in ObjectIterator(val,"{root}.{key}".format(key=key,root=root),level=level):
yield k1,v1
if hasattr(obj,"_fields_"):
for key,val in obj._fields_.iteritems():
for k1,v1 in ObjectIterator(val,"{root}.{key}".format(key=key,root=root),level=level):
yield k1,v1
else:
yield root,obj
тут правда нет свойств и добавлены структуры из ctypes. Более универсальный способ поиска - по результатам dir(obj)
doza_and
pupkin2
в котором невозможно метапрограммирование
меня интересуют только мною объявленные члены.
Почему невозможно? Очень даже возможно.

Помоему, в то что написано в моем примере - все можете сами и объявить. Может я вас недопонял
pupkin2
doza_and
Почему невозможно? вполне возможно.
правда? оО
ну сорри. я еще совсем зелен.
doza_and
ну может както так: :)
[i for i in a.__dict__.values() if isinstanse(i,str)]
pupkin2
doza_and, спасибо. последний пример самый лаконичный, на мой взгляд.
class myclass:
def __init__(self):
self.a = "a"
self.b = "b"

a = myclass()
print [i for i in a.__dict__.values() if isinstance(i,str)]
http://liveworkspace.org/code/3089312871ae867c47453ff508046021
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB