Форум сайта python.su
чтобы преобразовать dict в объект можно создать класс
class l_Class: pass
создать объект класса
l_Object = l_Class()
а далее для l_Object использовать:
setattr( l_Object, “aa”, “bb” )
и можно обращаться
print l_Object.aa
есть ли способ по-лучше?
Офлайн
Вообще-то в питоне словарь и так объект.
Офлайн
так как класс утсроен так что его атрибуты лежат в словаре (dict), можно просто проапдейтить этот словарь.
d = {'aa':'bb', 'cc':'dd'}
class l_Class: pass
l_Object = l_Class()
l_Object.__dict__.update(d)
print l_Object.aa
print l_Object.cc
d = {'aa':'bb', 'cc':'dd'}
class l_Class:
def __init__(self, init_d):
self.__dict__.update(init_d)
l_Object = l_Class(d)
print l_Object.aa
print l_Object.cc
Отредактировано (Сен. 16, 2008 17:52:02)
Офлайн
до кучи
import new
d = {'aa':'bb', 'cc':'dd'}
class l_Class: pass
obj = new.instance(l_Class, d)
Офлайн
Если уж пошла такая пьянка ;)
import new
d = {'aa':'bb', 'cc':'dd'}
a = new.classobj('l_class', (object,), d)
Офлайн
Интересно, а какой путь Ъ?
Офлайн
Есть кстати еще вариант, он инетресен тем, что при изменении словаря (например добавить чтонидь) атрибуты класса тоже будут изменяться:
import new
d = {'aa':'bb', 'cc':'dd'}
class c: pass
o = c()
o.__dict__ = d
d['kk'] = 23
print o.kk
Офлайн
FerromanНаверное завист от задачи.
Интересно, а какой путь Ъ?
Офлайн
Так працює:
>>> myClassObj = type('MyClass', (), {})()
>>> myClassObj.__dict__ = {'attr': 10}
>>> myClassObj.attr
10
>>> myClassObj.__dict__ = {'__attr': 10}
>>> myClassObj.__attr
10
>>> myClassObj = type('MyClass', (), {'__attr':10})()
>>> myClassObj.__attr
10
Отредактировано (Сен. 16, 2008 22:32:24)
Офлайн
Задача: преобразовать dict в объект и обращаться к ключам как к атрибутам.
Может кто-нибудь знает, почему этот код работает,
# -*- coding: UTF-8 -*-
class AttrInit(type):
def __call__(cls, **kwargs):
obj = super(AttrInit, cls).__call__()
for name, value in kwargs.items():
if isinstance(value, dict):
setattr(obj, name, cls(**value))
else:
setattr(obj, name, value)
return obj
class Message(object):
__metaclass__ = AttrInit
D = {'type': u'text', 'text': u'text body', 'val': {'id': {'code': 50}}}
msg = Message(**D)
print(msg.type)
print(msg.val.id.code)
# -*- coding: UTF-8 -*-
class AttrInit(type):
def __call__(cls, **kwargs):
obj = super(AttrInit, cls).__call__()
for name, value in kwargs.items():
if isinstance(value, dict):
setattr(obj, name, cls(**value))
else:
setattr(obj, name, value)
return obj
class Message(object):
__metaclass__ = AttrInit
D = {u'type': u'text', u'text': u'text body', u'val': {u'id': {u'code': 50}}}
msg = Message(**D)
print(msg.type)
print(msg.val.id.code)
Офлайн