В основном я хочу, чтобы иметь возможность принять class
что крякает как dict
(например, мой пример DICT
ниже) и добавить MixIn
, что позволяет мне получить доступ к значениям по DICT
«s как атрибуты ... напримерКак создать обобщение AttrDict Mixin для класса «dict-style» python?
print purchase.price # instead of purchase["price"]
Справочная информация: у меня есть несколько различных таблиц базы данных (не только DICT
пример), что внешний вид (& шарлатан) вроде dict
(например bsddb
.), и я хочу определить (используйте) стандартный AttrDictMixIn
. (И поэтому следует избегать использования газетного вырезать/вставить код)
# First try using a std dict
class AttrDict(dict):
def __init__(self, *args, **kwargs):
self.__dict__ = self
super(AttrDict, self).__init__(*args, **kwargs)
test1=AttrDict()
test1.x="111"
print 1,test1
# Next derive a crude UPPER dict
class DICT(dict): # EXAMPLE ONLY
def __getitem__(self,key):
return super(DICT,self).__getitem__(key.upper())
def __setitem__(self,key,value):
return super(DICT,self).__setitem__(key.upper(),value)
test2=DICT()
test2["x"]="222"
print 2,test2
# Next define a AttrDict MixIn
class AttrDictMixIn(object): # This is what I want to work...
def __init__(self, *args, **kwargs):
self.__dict__ = self
return super(AttrDict, self).__init__(*args, **kwargs)
# Apply the MixIn to DICT
class AttrDICT(DICT,AttrDictMixIn): pass
test3=AttrDICT()
test3.x="333.xxx"
test3["y"]="333.yyy"
print 3,test3,"X is missing"
print 4,"test3.x:",test3.x,"OK"
print 5,"test3['y']:",test3["y"],"OK"
print 6,"test3.y:",test3.y,"DUD"
print 7,"test3['x']:",test3["x"],"DUD"
Выход:
1 {'x': '111'}
2 {'X': '222'}
3 {'Y': '333.yyy'} X is missing
4 test3.x: 333.xxx OK
5 test3['y']: 333.yyy OK
6 test3.y:
Traceback (most recent call last):
File "x.py", line 39, in <module>
print 6,"test3.y:",test3.y,"DUD"
AttributeError: 'AttrDICT' object has no attribute 'y'
Я подозреваю, что я делаю что-то тривиальное неправильно ... Подсказки приветствуются. (Также могут быть указаны указатели на некоторые ссылочные примеры подобных Python MixIns)
Редактировать: объяснение причин, по которым линия self.__dict__ = self
будет разрывать множественное наследование.
Как вы имеете в виду * Но это не работает *? Вы хотите опубликовать отзыв о своей ошибке? –
Просто добавил комментарий «X отсутствует» и трассировка. – NevilleDNZ