Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 19, 2010 15:30:45

KaBaSya
От:
Зарегистрирован: 2009-12-17
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перехватить изменение элемента словаря/списка, в классе?

class ClassName(object):
def __init__(self):
self.dictionary = {
'key1': 1
'key2': 2
}


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



Офлайн

#2 Авг. 19, 2010 15:46:09

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как перехватить изменение элемента словаря/списка, в классе?

Напишите свой словарь (import UserDict).

..bw



Офлайн

#3 Авг. 19, 2010 15:48:59

KaBaSya
От:
Зарегистрирован: 2009-12-17
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перехватить изменение элемента словаря/списка, в классе?

А я это.. и не умею.



Офлайн

#4 Авг. 19, 2010 17:37:44

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Как перехватить изменение элемента словаря/списка, в классе?

Почему бы не сделать так?

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

a = EventDict()
a[5]=6

print a
а там уже через очередь информируйте кого следует.



Офлайн

#5 Авг. 19, 2010 18:15:09

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как перехватить изменение элемента словаря/списка, в классе?

потому что словарь изменяется не только через __setitem__ - есть много других способов.
Нужно перехватывать все.



Офлайн

#6 Авг. 19, 2010 19:41:12

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Как перехватить изменение элемента словаря/списка, в классе?

ТС четко указал, что нужно только присваивание. Так что по его вопросу - само то.



Офлайн

#7 Авг. 19, 2010 20:23:40

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как перехватить изменение элемента словаря/списка, в классе?

И упаси бог, если нормальный программист столкнётся с вашим кодом. И сочтёт он необходимых использовать да метод да update, что данный словароподобный объект позволит. И огребёт он от этого быдлокода. И вспомнит по именам, которые конечно же будут красоваться в каждом модуле, в шапке, да прописными.
Возвращайтесь на PHP или не наследуйтесь от dict вот так вот. Ей Богу, не доводите до греха.

..bw



Офлайн

#8 Авг. 19, 2010 20:49:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как перехватить изменение элемента словаря/списка, в классе?

:)



Офлайн

#9 Авг. 19, 2010 22:05:27

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перехватить изменение элемента словаря/списка, в классе?

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

Может на счет перегружаемых методов наврал, но в целом идея такая.



Отредактировано (Авг. 19, 2010 22:09:12)

Офлайн

#10 Авг. 19, 2010 22:16:07

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  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)
Или ещё какие-то методы надо переписать?
p.s. ибо иже еси херувимы.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version