Форум сайта python.su
0
class ClassName(object):
def __init__(self):
self.dictionary = {
'key1': 1
'key2': 2
}
classname = ClassName()
classname.dictionary['key1'] = 8 # Как перехватить это присваивание? на подобие __setattr__(self,) что ли....
Офлайн
20
Напишите свой словарь (import UserDict).
..bw
Офлайн
0
А я это.. и не умею.
Офлайн
6
Почему бы не сделать так?
class EventDict(dict):
def __setitem__(self, k, v):
print "setitem event"
dict.__setitem__(self, k, v)
a = EventDict()
a[5]=6
print a
Офлайн
14
потому что словарь изменяется не только через __setitem__ - есть много других способов.
Нужно перехватывать все.
Офлайн
6
ТС четко указал, что нужно только присваивание. Так что по его вопросу - само то.
Офлайн
20
И упаси бог, если нормальный программист столкнётся с вашим кодом. И сочтёт он необходимых использовать да метод да update, что данный словароподобный объект позволит. И огребёт он от этого быдлокода. И вспомнит по именам, которые конечно же будут красоваться в каждом модуле, в шапке, да прописными.
Возвращайтесь на PHP или не наследуйтесь от dict вот так вот. Ей Богу, не доводите до греха.
..bw
Офлайн
14
:)
Офлайн
0
Вместо наследования агрегация. Ну и в прокси (в классе-обёртке) перегрузить __setattr__ , __getattr__, __delattr__ . Как-то так. Может ещё какие-то тонкости всплывут потом при работе.
Может на счет перегружаемых методов наврал, но в целом идея такая.
Отредактировано (Авг. 19, 2010 22:09:12)
Офлайн
6
Ну незнал, виноват, каюсь, челом бью, и.т.д. Верный вариант такой?
from UserDict import UserDict
class UberDict(UserDict):
def __setitem__(self, k, v):
print "setitem"
self.data[k]=v
def update(self, **vals):
print "update"
self.data.update(vals)
Офлайн