Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 3, 2010 23:48:03

ykm
От:
Зарегистрирован: 2010-11-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Классы для работы со списками

Доброго времени!
Не так давно начал разбираться в ООП (как собственно и в Питоне). Сейчас требуется написать класс для работы со списками.
Список формируется из файла, данные в котором хранятся в таком виде:
0,Иванов А. И.,Ген. директор
1,Петров С. Р.,Бухгалтер
2,Сидоров Г. Н.,Менеджер

Получаем “двумерный массив”. Интересует, как лучше организовать систему классов для добавления новых сотрудников, вывода всех сотрудников на экран и т.п.
Сделать 2 класса Сотрудник и Сотрудники или же обойтись одним. Делать формирование списка как метод класса или же отдельно.
Короче говоря, требуется небольшое пояснение по данному вопросу. Спасибо!



Офлайн

#2 Ноя. 4, 2010 00:21:24

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

Классы для работы со списками

А чем родные списки не устраивают (или даже словарь с кортежами)?

people = {0: ('Иванов А. И.', 'Ген. директор')}

people[1] = 'Петров С. Р.', 'Бухгалтер' # скобки не обязательны

people.update({
2: ('Сидоров Г. Н.', 'Менеджер'),
3: ('FooBar', 'Baz')
})
..bw



Отредактировано (Ноя. 4, 2010 00:22:09)

Офлайн

#3 Ноя. 4, 2010 00:38:13

ykm
От:
Зарегистрирован: 2010-11-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Классы для работы со списками

Родные списки используются. Формируем списки из файла стандартными методами.
Но далее, например, нужно добавить ещё 1 сотрудника и записать обратно в файл.
Для этого необходимо организовать метод Add в классе Staff. И вообще, не понимаю, как связать классы Employee (Сотрудник) и Staff (Сотрудники)… Может быть нужно использовать только Staff ?



Офлайн

#4 Ноя. 4, 2010 02:31:07

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Классы для работы со списками

Надо именно самому сделать это все, или сойдет модуль csv?



Офлайн

#5 Ноя. 4, 2010 03:05:57

ykm
От:
Зарегистрирован: 2010-11-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Классы для работы со списками

Вот смотрите, с помощью модуля CSV формирую список:

staff = []
data = csv.reader(open(os.path.join(os.curdir, 'staff.csv'), 'rb'), delimiter=';')
for row in data :
staff.append(row)
Затем так же через циклы уже могу со списком работать как хочу, выводить данные таблицей, добавлять поля… Но мне нужно все эти действия сделать как методы классов, т.е.
чтобы вывести таблицу, нужно будет написать Staff.getTable() .
Пока не до конца понимаю логику ООП, поэтому прошу каких-то объяснений.



Офлайн

#6 Ноя. 4, 2010 12:43:59

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Классы для работы со списками

может быть прочитаете литературу, тема не такая маленькая что бы описать в одном посте



Офлайн

#7 Ноя. 4, 2010 15:02:39

ykm
От:
Зарегистрирован: 2010-11-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Классы для работы со списками

Да мне бы примерчик с использованием класса Employee (т.е. 1 работник), наследующим его классом Staff(т.е. все сотрудники) и методами AddRow(добавить нового сотрудника), GetTable(вывести всех сотрудников), конечно если такая структура правильная (мб нужно использовать 1 класс). Думаю после этого я уже разберусь в теме и сделаю всё, что мне нужно.
Также приму советы хорошей литературы по ООП или простые примеры отличия процедурного и объекто-ориентированного подходов.



Отредактировано (Ноя. 4, 2010 18:46:03)

Офлайн

#8 Ноя. 4, 2010 19:52:50

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

Классы для работы со списками

Staff не может наследоваться от Employee, это же очевидно.
Вот набросок:

class Employes(object):

def __init__(self, filename = 'emplyes.csv'):
self.filename = filename
self.items = {}
self.reset()

def reset(self):
self.clear()
if os.path.exists(self.filename):
data = csv.reader(open(self.filename), delimiter=';')
# TODO
# перегоняем данные в словарь self.item,
# словарь того вида, что я показывал выше
raise NotImplementedError('TODO csv reader')

def clear(self):
self.items.clear()

def save(self):
"""TODO
Используя csv записать содержимое словаря self.items в self.filename.
"""
raise NotImplementedError('TODO csv writer')

def add(self, name, appointment):
new_id = max(self.items.keys() or [0]) + 1
self.items[new_id] = name, appointment

def remove(self, emp_id):
self.items.pop(emp_id)

def filter(self, name_mask = '', app_mask = ''):
"""Новый словарь сотрудников, в имени которых содержится `name_mask`,
а в должности `app_mask`."""

filtered_employes = {}

for id, (name, app) in self.items.iteritems():
if name_mask in name and app_mask in app:
filtered_employes[id] = name, app

return filtered_employes
Как-то так. Другие программисты предложат тебе ещё тысячу вариантов.

p.s. В Employes.filter нужно вообще то объект Employes возвращать, но это ты уже сам доделаешь.

p.p.s. Employes.items вообще-то это скрытый (private или protected) атрибут, но я не стал здесь этого показывать (да и как-то не люблю имена вида _items), т.е. доступ к нему извне противопоказан.

p.p.p.s. Ещё не помешает реализовать методы __getitem__, __len__, __iter__ и т.п.

..bw



Отредактировано (Ноя. 4, 2010 20:40:52)

Офлайн

#9 Ноя. 4, 2010 21:19:04

ykm
От:
Зарегистрирован: 2010-11-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Классы для работы со списками

bw
Staff не может наследоваться от Employee, это же очевидно.
Там имеется в виду - Staff наследует Employee, такое ведь возможно?


За код огромное спасибо, буду разбираться :)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version