Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 20, 2008 13:54:50

gard
От:
Зарегистрирован: 2008-02-20
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с программой

Здравствуйте!
Буквально вчера завалил зачет по питону. Преподавателю нужно было написать два класса для учета ЖД рейсов. запись в файл, чтение, поиск. Второй класс должен был наследоваться от словаря. Прогу то я написал, но просто со списками. Для форумчан эта прога наверное очень простая. Я уж не буду позориться приводить ее здесь. А вот наследование от словаря я понятия не имею как и главное что это дает. Литературы мало. Ухх предстоит же мне еще почитать всего. В общем я и еще двое завалились, а один человек сдал. Вот по его программе я сегодня и пытался понять как это наследование от словаря работает. Ничего не понял. Может прога является подставой. Я не понимаю ее сути. Она состоит из двух классов. Класс Товары - что то типа контейнера. Описывает единицу “Товар”. А класс конт должен организовать хранение объектов класса Товар с их чтением/записью в файл, поиск по ним. Видимо в виде словаря. Вот эта программа, вуаля:

# -*- 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()
Вот собственно она.. программа, которая прошла страшный зачет у преподавателя. С классом товары все понятно, он как бы создает объект. Но как я ни старался, я не смог понять другой класс - наследник словаря:
1. В __init__(self, default=None)передается атрибут default и он же возвращается, что это и зачем его возвращать?
2. Непонимаю что за метод __getitem__(self, key), аналогично зачем он принимает key и возвращает его либо default.
3. Метод WriteToFile(self) вообще поражает, он записывает элементы словаря в файл. Но! Откуда в словаре оказались элементы объекта класса Товары? Ведь нигде не создавался объект этого класса.
4. Насчет поиска никаких вопросов.. только смущают точки. Ну поиск по словарю.. в принципе понятно как сделать.

Вот.. прошу помочь разобраться в программе.



Отредактировано (Фев. 20, 2008 13:58:10)

Офлайн

#2 Фев. 20, 2008 14:38:50

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с программой

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)

Офлайн

#3 Фев. 20, 2008 15:02:42

gard
От:
Зарегистрирован: 2008-02-20
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с программой

1. Возврат дефолта из инит уберу..
2. Спасибо что сказали что возвращается dict. Но все же зачем? Метод вроде потом нигде не используется.
3. А как в словарь попадают записи из полей объекта Товар? Чего то я запутался малость.



Офлайн

#4 Фев. 20, 2008 16:52:23

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Помогите разобраться с программой

Класс Cont нужен для того, чтобы работать как dict, но при этом иметь дополнительные методы для сохранения в файл, поиска, массажа и прочее. Тебя удивляет, как же все-таки попадают элементы товара в в него? Ничего удивительного, ибо в данной программе - никак.
Появляется вопрос, а как они ДОЛЖНЫ появлятся в объекте d? Да так же, как и dict - d = ‘бревно’.
Собственно, код должен выглядеть примерно так:
d = Cont()
brain = Tovari('моск', 0)
goods = Tovari('еще что-то там', 10)
d = brain
d = goods

Но у этого злобного класса есть не менее злобный метод - Append (OMG - методы с большой буквы) - то бишь монжно и вот так d.Append(1, brain). В чем удобство - не знаю…
Фишка в том, что dict используется как список, хотя предназначен не для этого (обрати внимание - ключ не нужен в программе вообще, по большому счету).
Впечатление от прогри - самое печальное, перепиши ее лучше заново, так как по-любому - низачот.



Офлайн

#5 Фев. 21, 2008 10:29:44

gard
От:
Зарегистрирован: 2008-02-20
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с программой

Спасибо. :) Я кажется понял что к чему .. вчера мне еще кое что объяснили по другой программе. Сегодня поразбираюсь. Щас тока поем и в бой! Потом если тьфу тьфу все пойму - выложу программу со словарем получше этой.



Офлайн

#6 Фев. 22, 2008 17:23:18

multik
От:
Зарегистрирован: 2007-10-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с программой

gard
Потом если тьфу тьфу все пойму - выложу программу со словарем получше этой.
таких бы людей побольше…
плюспнул за трудолюбие.



Офлайн

#7 Фев. 26, 2008 14:01:16

gard
От:
Зарегистрирован: 2008-02-20
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с программой

Вот моя версия этой программки. :) Версия без меню, просто показывает что прога вроде пашет. :)

# -*- 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()



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version