2016-09-19 2 views
0

В основном я хочу, чтобы иметь возможность принять 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 будет разрывать множественное наследование.

+1

Как вы имеете в виду * Но это не работает *? Вы хотите опубликовать отзыв о своей ошибке? –

+0

Просто добавил комментарий «X отсутствует» и трассировка. – NevilleDNZ

ответ

0

Реализовать это так:

class AttrDictMixin(object): 
    def __getattr__(self, name): 
     return self[name] 
    def __setattr__(self, name, value): 
     self[name] = value 
    def __delattr__(self, name): 
     del self[name] 

После доступа к атрибутам, установка или удаление - __getattr__, __setattr__ и __delattr__ называются соответственно.

Имейте в виду Mixins должны прийти до базового класса в наследстве:

class AttrDict(AttrDictMixin, DICT): pass