Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2008 17:22:23

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

чтобы преобразовать dict в объект можно создать класс
class l_Class: pass
создать объект класса
l_Object = l_Class()
а далее для l_Object использовать:
setattr( l_Object, “aa”, “bb” )
и можно обращаться
print l_Object.aa

есть ли способ по-лучше?



Офлайн

#2 Сен. 16, 2008 17:36:43

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Вообще-то в питоне словарь и так объект.

Офлайн

#3 Сен. 16, 2008 17:49:20

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

так как класс утсроен так что его атрибуты лежат в словаре (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)

Офлайн

#4 Сен. 16, 2008 21:43:58

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

преобразовать dict в объект

до кучи

import new

d = {'aa':'bb', 'cc':'dd'}

class l_Class: pass

obj = new.instance(l_Class, d)
но конструктор не вызовется.



Офлайн

#5 Сен. 16, 2008 21:55:43

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Если уж пошла такая пьянка ;)

import new

d = {'aa':'bb', 'cc':'dd'}

a = new.classobj('l_class', (object,), d)



Офлайн

#6 Сен. 16, 2008 21:59:54

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Интересно, а какой путь Ъ?

Офлайн

#7 Сен. 16, 2008 22:05:21

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Есть кстати еще вариант, он инетресен тем, что при изменении словаря (например добавить чтонидь) атрибуты класса тоже будут изменяться:

import new

d = {'aa':'bb', 'cc':'dd'}

class c: pass
o = c()

o.__dict__ = d

d['kk'] = 23

print o.kk



Офлайн

#8 Сен. 16, 2008 22:08:22

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Ferroman
Интересно, а какой путь Ъ?
Наверное завист от задачи.
Если нужно одномоментно добавить в уже готовый объект атрибутов, то obj.__dict__.update мне кажется наименее магическим.



Офлайн

#9 Сен. 16, 2008 22:27:45

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Так працює:

>>> 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)

Офлайн

#10 Янв. 31, 2011 18:23:44

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Задача: преобразовать 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)
Выдает ошибку: TypeError: __call__() keywords must be strings



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version