Найти - Пользователи
Полная версия: Как перехватить изменение элемента словаря/списка, в классе?
Начало » Python для новичков » Как перехватить изменение элемента словаря/списка, в классе?
1 2
KaBaSya
class ClassName(object):
def __init__(self):
self.dictionary = {
'key1': 1
'key2': 2
}


classname = ClassName()
classname.dictionary['key1'] = 8 # Как перехватить это присваивание? на подобие __setattr__(self,) что ли....
bw
Напишите свой словарь (import UserDict).

..bw
KaBaSya
А я это.. и не умею.
truporez
Почему бы не сделать так?

class EventDict(dict):
def __setitem__(self, k, v):
print "setitem event"
dict.__setitem__(self, k, v)

a = EventDict()
a[5]=6

print a
а там уже через очередь информируйте кого следует.
Андрей Светлов
потому что словарь изменяется не только через __setitem__ - есть много других способов.
Нужно перехватывать все.
truporez
ТС четко указал, что нужно только присваивание. Так что по его вопросу - само то.
bw
И упаси бог, если нормальный программист столкнётся с вашим кодом. И сочтёт он необходимых использовать да метод да update, что данный словароподобный объект позволит. И огребёт он от этого быдлокода. И вспомнит по именам, которые конечно же будут красоваться в каждом модуле, в шапке, да прописными.
Возвращайтесь на PHP или не наследуйтесь от dict вот так вот. Ей Богу, не доводите до греха.

..bw
Андрей Светлов
:)
Kogrom
Вместо наследования агрегация. Ну и в прокси (в классе-обёртке) перегрузить __setattr__ , __getattr__, __delattr__ . Как-то так. Может ещё какие-то тонкости всплывут потом при работе.

Может на счет перегружаемых методов наврал, но в целом идея такая.
truporez
Ну незнал, виноват, каюсь, челом бью, и.т.д. Верный вариант такой?
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)
Или ещё какие-то методы надо переписать?
p.s. ибо иже еси херувимы.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB