подскажите.
есть класс. нужно перебрать все его члены. как такое реализовывается?
второй вопрос: для определения типа при переборе, достаточно использовать: “type(iter) == need_type” ?
спасибо.
>>>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
d1ffuz0rнужно перебрать все члены являющиеся строками, и произвести над ними некоторое действие.
просто вывести или вызвать?
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)
нужно перебрать все члены являющиеся строками
doza_andкакой смысл употреблять “объект” в ЯП, в котором невозможно метапрограммирование? ;)
наверное имеется ввиду объект класса.
doza_andменя интересуют только мною объявленные члены.
При таком способе вы потеряете строки которые являются свойствами объекта и строки являющиеся статическими строками в классе.
doza_andв пайтоновской терминологии пока не силен. неделю как изучаю.
а кто такие строки?
class myclass:
def __init__(self):
self.a = "a"
self.b = "b"
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
pupkin2Почему невозможно? Очень даже возможно.
в котором невозможно метапрограммирование
меня интересуют только мною объявленные члены.
doza_andправда? оО
Почему невозможно? вполне возможно.
[i for i in a.__dict__.values() if isinstanse(i,str)]
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)]