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

This commit is contained in:
serafim.urukov 2021-07-26 23:47:37 +03:00
parent 976201b08c
commit 10ced6941d
7 changed files with 109 additions and 2 deletions

6
.gitignore vendored
View File

@ -1,3 +1,5 @@
.vscode
/SpreadsheetsService/client_secret.json
/SpreadsheetsService/token.json
SpreadsheetsService/client_secret.json
SpreadsheetsService/token.json
SpreadsheetsService/models/__pycache__/*
SpreadsheetsService/utils/__pycache__/*

View File

@ -0,0 +1,2 @@
from .student import *
from .group import *

View File

@ -0,0 +1,14 @@
class Assignment:
"""Задание."""
def __init__(self, weight: float, values: tuple):
self.weight = weight
self.values = values
@property
def total(self) -> float:
"""Получить общую оценку по заданию.
`вес*СУММ(рез-ты)`
"""
return sum(self.values) * self.weight

View File

View File

@ -0,0 +1,64 @@
from .student import Student
class StudentNotFound(Exception):
def __init__(self, message):
self.message = message
super().__init__(self.message)
class Group:
"""Объект "Группа" для работы со списком студентов.
Используется для работы с множеством студентов.
"""
def __init__(self, group_id: int):
self.group_id: int = group_id
self.students: Student = []
def __iter__(self):
"""Делегирует итератор на список студентов.
Так, можно использовать конструкцию
```python
for student in group
```
"""
return iter(self.students)
def add_student(self, student: Student):
"""Добавить студента в группу."""
self.students.append(student)
def get_student_by_number(self, number: int) -> Student:
"""Возвращает студента по его номеру, если номера нет, то поднимает
ошибку."""
f = lambda s: number == s.number
try:
return next(filter(f, self.students))
except StopIteration:
raise StudentNotFound("Не могу найти студента по номеру")
def find_students(self, name: str) -> list:
"""Найти студентов в группе по имени.
Возвращает список найденных студентов. Если никого не найдет, вернет
пустой список.
Arguments:
name (str): текстовое поле, часть имени.
"""
f = lambda s: name.lower() in s.name.lower()
return list(filter(f, self.students))
def top(self, n: int = None) -> list:
"""Топ N студентов группы по среднему баллу. Возвращает весь список,
если N не указано."""
n = len(self.students) if n is None else n
return sorted(self.students, key=lambda student: student.grade)[:n]
def between(self, a: float, b: float) -> list:
"""Список студентов, у которых оценка между [a, b]."""
f = lambda student: a < student.average < b
return list(filter(f, self.students))

View File

@ -0,0 +1,25 @@
from .assignment import Assignment
class Student:
"""Позволяет выполнять операции над студентами."""
def __init__(self, number: int, name: str):
self.number: int = number
self.name: str = name
self.tg_id = None
self.assignments = []
@property
def add_assignment(self, assignment: Assignment):
self.assignments.append(assignment)
@property
def grade(self) -> float:
"""Получить среднюю оценку студента по текущему контролю."""
return 2
@property
def score(self):
"""Количество баллов у студента."""
return sum([a.total for a in self.assignments])

View File