Форум сайта python.su
Здравствуйте!
Буквально вчера завалил зачет по питону. Преподавателю нужно было написать два класса для учета ЖД рейсов. запись в файл, чтение, поиск. Второй класс должен был наследоваться от словаря. Прогу то я написал, но просто со списками. Для форумчан эта прога наверное очень простая. Я уж не буду позориться приводить ее здесь. А вот наследование от словаря я понятия не имею как и главное что это дает. Литературы мало. Ухх предстоит же мне еще почитать всего. В общем я и еще двое завалились, а один человек сдал. Вот по его программе я сегодня и пытался понять как это наследование от словаря работает. Ничего не понял. Может прога является подставой. Я не понимаю ее сути. Она состоит из двух классов. Класс Товары - что то типа контейнера. Описывает единицу “Товар”. А класс конт должен организовать хранение объектов класса Товар с их чтением/записью в файл, поиск по ним. Видимо в виде словаря. Вот эта программа, вуаля:
# -*- coding: cp1251 -*- import os class Tovari: def __init__ (self, Name="", Cena=""): self.Name=Name self.Cena=Cena def SetAttributes (self, string): self.Name, self.Cena = string.split(';') return True def Print(self): print "Название:", self.Name print "Цена:", self.Cena print "-----------" class Cont(dict): def __init__(self, default=None): dict.__init__(self) #__init__ для словаря self.default = default return self.default def __getitem__(self, key): #Непонятный метод try: return dict.__getitem__(self, key) except KeyError: return self.default def Append(self, a, b=''): self[b]=a def WriteToFile(self): #Значения из словаря пишем в файл f=open('1.txt', "w") #_откуда в словаре объекты класса Товары? for l in dict.values(self): f.write(l.Name+';'+l.Cena+';'+'\n') #Откуда??? f.close() def Find (self, name, FullMatch=True): if FullMatch: for k in dict.values(self): if k.name==name: return k else: for k in dict.values(self): if k.name.find(name)!=-1: return k d=Cont() d.WriteToFile()
Отредактировано (Фев. 20, 2008 13:58:10)
Офлайн
1. В __init__(self, default=None)передается атрибут default и он же возвращается, что это и зачем его возвращать? - default используется дальше в __getitem__, а насчёт возврата его из __init__ - явная ошибка, такая программа просто не запустится.
2. Непонимаю что за метод __getitem__(self, key), аналогично зачем он принимает key и возвращает его либо default. - этот метод возвращает не key, а значение dict, если такого ключа в словаре нету, то возвращается default из пункта 1.
3. То что не создавался, это конечно проблема, но к самому методу отношения не имеет.
Отредактировано (Фев. 20, 2008 14:42:38)
Офлайн
1. Возврат дефолта из инит уберу..
2. Спасибо что сказали что возвращается dict. Но все же зачем? Метод вроде потом нигде не используется.
3. А как в словарь попадают записи из полей объекта Товар? Чего то я запутался малость.
Офлайн
Класс Cont нужен для того, чтобы работать как dict, но при этом иметь дополнительные методы для сохранения в файл, поиска, массажа и прочее. Тебя удивляет, как же все-таки попадают элементы товара в в него? Ничего удивительного, ибо в данной программе - никак.
Появляется вопрос, а как они ДОЛЖНЫ появлятся в объекте d? Да так же, как и dict - d = ‘бревно’.
Собственно, код должен выглядеть примерно так:
d = Cont()
brain = Tovari('моск', 0)
goods = Tovari('еще что-то там', 10)
d = brain
d = goods
Но у этого злобного класса есть не менее злобный метод - Append (OMG - методы с большой буквы) - то бишь монжно и вот так d.Append(1, brain). В чем удобство - не знаю…
Фишка в том, что dict используется как список, хотя предназначен не для этого (обрати внимание - ключ не нужен в программе вообще, по большому счету).
Впечатление от прогри - самое печальное, перепиши ее лучше заново, так как по-любому - низачот.
Офлайн
Спасибо. :) Я кажется понял что к чему .. вчера мне еще кое что объяснили по другой программе. Сегодня поразбираюсь. Щас тока поем и в бой! Потом если тьфу тьфу все пойму - выложу программу со словарем получше этой.
Офлайн
gardтаких бы людей побольше…
Потом если тьфу тьфу все пойму - выложу программу со словарем получше этой.
Офлайн
Вот моя версия этой программки. :) Версия без меню, просто показывает что прога вроде пашет. :)
# -*- coding: cp1251 -*- #import os class Tovari: def __init__ (self, Name="", Cena=""): self.Name=Name self.Cena=Cena def SetAttributes (self, string): self.Name, self.Cena = string.split(';') return True #определил для того чтобы поглядеть что вернет поиск def display(self): print self.Name print self.Cena #Класс - наследник словаря #Для него dict.keys(self) - список ключей, dict.values(self) - переменных class Cont(dict): #В __init__ вызываем конструктор словаря def __init__(self, default=None): dict.__init__(self) #__init__ для словаря self.default = default """#метод получает значение по ключу key def __getitem__(self, key): try: return dict.__getitem__(self, key) #получить из словаря по ключу except KeyError: return self.default""" #метод внесения значений в словарь, чтобы писать d.Append(a,key) #вместо d[b] = a def Append(self, val, key=''): self[key]=val #метод записи содержимого словаря в файл def WriteToFile(self): f=file("tovar.txt", "w") for l in dict.values(self): #для каждой переменнной из словаря f.write(l.Name + ';' + l.Cena + '\n') #запис. построчно f.close() #метод чтения из файла содержимого в словарь (мой самописный) def ReadFromFile(self): f = file("tovar.txt", "r") #support = {} d = Cont() c = 0 for l in f: t = Tovari() t.SetAttributes(l) #support[c] = t d.Append(t,c) c += 1 f.close() #Выводит записи из словаря на экран def display(self): for key in dict.keys(self): print "Key: ", key print "Name: ", self[key].Name print "Cena: ", self[key].Cena print " " #метод поиска _ не сработал! """def Find (self, name, FullMatch=True): if FullMatch: for k in dict.values(self): if k[name]==name: return k else: for k in dict.values(self): if k.name.find(name)!=-1: return k""" #мой метод поиска, фактически возвращает объект первого класса def Find(self, name): for k in dict.keys(self): if self[k].Name == name: #print self[k].Name #Тестовый вывод имени найденного объекта #self[k].display() #Тестовый вызов метода "дисплей" объекта return self[k] #Тестирование программы------------------------------+ #для понимания работы смотреть отсюда а далее методы в коде выше t = Tovari("tovar1", "100") t2 = Tovari("tovar2", "200") t3 = Tovari("tovar3", "300") d=Cont() key = 1 #ключи, стоит зметить очередность key2 = 2 key3 = 0 d.Append(t, key) d.Append(t2,key2) d.Append(t3,key3) d.WriteToFile() d.ReadFromFile() print d.keys() print d.values() print "---------------------" d.display() print "Найденный объект \"Товары\" в словаре: " print d.Find("tovar1"), "\n" print "Найдено в словаре и присвоено объекту \"Товары\": " t4 = d.Find("tovar2") t4.display()
Офлайн