2013-07-03 6 views
0

Я создаю класс, который имеет словарь, который содержит несколько списков вместе с другими переменными. Я хотел бы, чтобы люди, использующие класс, могли добавлять элементы в списки, но я хочу пройти метод setter, чтобы я мог убедиться, что значения, которые они добавляют в список, действительны. Метод getter более удобен для пользователя, так что не обязательно будет вводить значение переменной.dictionary ['value'] ['subvalue'] ['third inested thing'], чтобы получить значение.python getter и setter методы для списка и + = operator

У меня есть что-то, что работает, но метод setter вызывается, когда вы используете оператор equals. Мне было интересно, можно ли вызвать метод setter при вызове + =, так как пользователь будет добавлять в список. Это кажется более естественным.

Вот некоторые псевдокоды, что я сделал до сих пор

def addItemtoList(self,inValue): 
    if inValue in listOfAcceptableValues: 
     self.really['long']['nested']['dictionaries']['array'] = list(set(self.really['long']['nested']['dictionaries']['array'] + [inValue])) 

def getDeeplyNestedList(self): 
    return self.really['long']['nested']['dictionaries']['array'] 

thatList = property(getDeeplyNestedList, addItemtoList) 
+0

Мне кажется, что все будет намного проще и удобочитаемо, если вы создали несколько простых объектов и используете композицию. –

+0

Это сложно, потому что 'a + = b' * кажется *, как будто он должен иметь такое же поведение, как' a = a + b', но на самом деле это не так; он изменяет список на месте, например 'a.extend (b)'. Я не знаю, можете ли вы обойти это без подкласса «list». – icktoofay

+0

Кстати, вы можете иметь словари вплоть до того, как не писать собственный класс, используя 'defaultdict':' from collections import defaultdict' 'def make_infinite_dict():' 'return defaultdict (make_infinite_dict)' 'my_infinite_dict = make_infinite_dict (make_infinite_dict)) ' – icktoofay

ответ

1

Там нет особого смысла создавать временный набор только использовать его для одного теста от членства. Мог бы также просто линейный поиск в list

def addItemtoList(self,inValue): 
    L = self.really['long']['nested']['dictionaries']['array'] 
    if inValue in listOfAcceptableValues and inValue not in L: 
     L.append(inValue) 

Когда кто-то пытается расширить список с помощью

foo.thatList += ['Some', 'items'] 

метод list.extend называется в списке, так что addItemtoList не участвует в все. Чтобы достичь того, чего вы хотите, вам нужно будет вернуть thatList завернутую версию списка. Любая композиция или подклассы будут работать

Смежные вопросы