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

Получаем “двумерный массив”. Интересует, как лучше организовать систему классов для добавления новых сотрудников, вывода всех сотрудников на экран и т.п.
Сделать 2 класса Сотрудник и Сотрудники или же обойтись одним. Делать формирование списка как метод класса или же отдельно.
Короче говоря, требуется небольшое пояснение по данному вопросу. Спасибо!
bw
А чем родные списки не устраивают (или даже словарь с кортежами)?
people = {0: ('Иванов А. И.', 'Ген. директор')}

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

people.update({
2: ('Сидоров Г. Н.', 'Менеджер'),
3: ('FooBar', 'Baz')
})
..bw
ykm
Родные списки используются. Формируем списки из файла стандартными методами.
Но далее, например, нужно добавить ещё 1 сотрудника и записать обратно в файл.
Для этого необходимо организовать метод Add в классе Staff. И вообще, не понимаю, как связать классы Employee (Сотрудник) и Staff (Сотрудники)… Может быть нужно использовать только Staff ?
pasaranax
Надо именно самому сделать это все, или сойдет модуль csv?
ykm
Вот смотрите, с помощью модуля CSV формирую список:
staff = []
data = csv.reader(open(os.path.join(os.curdir, 'staff.csv'), 'rb'), delimiter=';')
for row in data :
staff.append(row)
Затем так же через циклы уже могу со списком работать как хочу, выводить данные таблицей, добавлять поля… Но мне нужно все эти действия сделать как методы классов, т.е.
чтобы вывести таблицу, нужно будет написать Staff.getTable() .
Пока не до конца понимаю логику ООП, поэтому прошу каких-то объяснений.
sp3
может быть прочитаете литературу, тема не такая маленькая что бы описать в одном посте
ykm
Да мне бы примерчик с использованием класса Employee (т.е. 1 работник), наследующим его классом Staff(т.е. все сотрудники) и методами AddRow(добавить нового сотрудника), GetTable(вывести всех сотрудников), конечно если такая структура правильная (мб нужно использовать 1 класс). Думаю после этого я уже разберусь в теме и сделаю всё, что мне нужно.
Также приму советы хорошей литературы по ООП или простые примеры отличия процедурного и объекто-ориентированного подходов.
bw
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
ykm
bw
Staff не может наследоваться от Employee, это же очевидно.
Там имеется в виду - Staff наследует Employee, такое ведь возможно?


За код огромное спасибо, буду разбираться :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB