From 81f9127b1b1cab6da8548d4db5541e197402b440 Mon Sep 17 00:00:00 2001 From: SergeyZ06 Date: Sat, 23 Jan 2021 22:04:15 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F:=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8th hometask/1th task.py | 95 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 8th hometask/1th task.py diff --git a/8th hometask/1th task.py b/8th hometask/1th task.py new file mode 100644 index 0000000..d7f48e8 --- /dev/null +++ b/8th hometask/1th task.py @@ -0,0 +1,95 @@ +from random import randint + + +# Класс Дата +class Date: + # Словарь для преобразования списка с частями даты в словарь с частями даты + dict_parts_of_date = { + 0: 'day', + 1: 'month', + 2: 'year' + } + + # Конструктор: записывает дату из параметра в атрибут объекта + def __init__(self, str_data='01-01-1900'): + self.str_date = str_data + + # Метод Преобразования строчной записи даты в словарь с частями даты + # Принимает в качестве параметра строковую запись даты + # Возвращает словарь с частями дат в формате чисел или значение None в случае невозможности преобразования + @classmethod + def date_to_numeric(cls, str_to_int): + # Строка для промежуточного хранения частей даты через пробел + str_to_int = str_to_int.replace('-', ' ') + # Словарь для хранения чатей дат, туда будет записан результат работы метода + dict_to_int = {} + # Для каждого номера элемента и значения среди списка слов строки (частей даты) + for index, value in enumerate(str_to_int.split()): + # пробовать + try: + # добавить в итоговый словарь с соотвествующим индексом: + # 0 - день + # 1 - месяц + # 2 - год + # преобразованную в число соответствующую часть даты + dict_to_int[cls.dict_parts_of_date.get(index)] = int(value) + # при невозможности преобразования + except ValueError: + # поместить в словарь значение None + dict_to_int[cls.dict_parts_of_date.get(index)] = None + # Вернуть сформированный словарь + return dict_to_int + + # Метод Проверки даты + # Принимает в качестве параметра строковую запись даты + @staticmethod + def date_validation(str_to_validate): + # Преобразовать строковую запись даты в словарь с частями даты + dict_to_validate = Date.date_to_numeric(str_to_validate) + + # Пробовать + try: + # оценить часть даты "День" + if dict_to_validate['day'] < 1 or dict_to_validate['day'] > 31: + # в случае некорректного значения вывести сообщение + print(f'Part "day" of {str_to_validate} is not correct') + # в случае невозможности сравнения + except TypeError: + # вывести сообщение + print(f'Part "day" of {str_to_validate} is not correct') + + # Аналогичная проверка для части даты "Месяц" + try: + if dict_to_validate['month'] < 1 or dict_to_validate['month'] > 12: + print(f'Part "month" of {str_to_validate} is not correct') + except TypeError: + print(f'Part "month" of {str_to_validate} is not correct') + + # Аналогичная проверка для части даты "Год" + try: + if dict_to_validate['year'] < 1900 or dict_to_validate['year'] > 2100: + print(f'Part "year" of {str_to_validate} is not correct') + except TypeError: + print(f'Part "year" of "{str_to_validate}" is not correct') + + +# Создать объект класса Дата +new_date = Date(f'{randint(1, 30):02}-{randint(1, 12):02}-{randint(1900, 2100)}') +# Отобразить содержимое объекта +print(new_date.str_date) +# Отобразить результат рабты метода Преобразования +print(Date.date_to_numeric(new_date.str_date)) +# Вызвать метод Проверки даты +Date.date_validation(new_date.str_date) + +# Создать объект класса Дата с заведомо некорректным годом +print() +new_date_2 = Date(f'01-01-2oo5') +print(Date.date_to_numeric(new_date_2.str_date)) +Date.date_validation(new_date_2.str_date) + +# Создать объект класса Дата с заведомо некорректными днём и годом +print() +new_date_3 = Date(f'00-10-2200') +print(Date.date_to_numeric(new_date_3.str_date)) +Date.date_validation(new_date_3.str_date) From ef682389ea8feb5b6786d6ff947c01cd9db73574 Mon Sep 17 00:00:00 2001 From: SergeyZ06 Date: Sun, 24 Jan 2021 18:57:25 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F:=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8th hometask/2th task.py | 75 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 8th hometask/2th task.py diff --git a/8th hometask/2th task.py b/8th hometask/2th task.py new file mode 100644 index 0000000..a032d68 --- /dev/null +++ b/8th hometask/2th task.py @@ -0,0 +1,75 @@ +# Исключение для обработки деления на нуль +class MyZeroDivision(Exception): + def __init__(self, strange_message): + self.strange_message = strange_message + + +# Исключение для обработки преобразования строки в число +class MyValueError(Exception): + def __init__(self, another_strange_message): + self.another_strange_message = another_strange_message + + +# Запрос переменных для деления у пользователя +# var_a - переменная для делимого +# var_b - переменная для делителя +var_a = input(f'Enter some digit to divide it: ') +var_b = input(f'Enter some digit to divide first digit on it: ') + +# Попробовать преобразовать значение переменной var_a +try: + # Если значение переменной является числом + if var_a.isdigit(): + # преобразовать переменную + var_a = float(var_a) + # иначе + else: + # поднять исключение + raise MyValueError(f'Var_a has not a numeric value') +# Перехватить исключение +except MyValueError as my_value_error_var_a: + # Вывести очень важное сообщение + print(my_value_error_var_a.another_strange_message) + # Завершить программу с аварийным кодом + exit(1) +# Иначе +else: + # Вывести сообщение, что всё хорошо + print(f'Value of var_a successfully became numeric: {var_a}') + +# Аналогичный алгоритм для преобзования переменной var_b +try: + if var_b.isdigit(): + var_b = float(var_b) + else: + raise MyValueError(f'Var_b has not a numeric value') +except MyValueError as my_value_error_var_b: + print(my_value_error_var_b.another_strange_message) + exit(1) +else: + print(f'Value of var_b successfully became numeric: {var_b}') + +# Попробовать выполнить деление +try: + # Если значение делителя равно нулю + if var_b == 0: + # поднять исключение + raise MyZeroDivision(f'Oops, something went wrong! Are you sure you have not tried to divide on zero?') + # иначе + else: + # выполнить деление и сохранить результат в новую переменную + var_division_result = var_a / var_b +# Перехватить исключение +except MyZeroDivision as my_zero_division_result: + # Вывести ещё более важное сообщение + print(my_zero_division_result.strange_message) + # Завершить программу с аварийным кодом + exit(1) +# Иначе +else: + # Вывести сообщение с результатом деления + print(f'Here is the result: {var_division_result}') +# в конце +finally: + # Вывести сообщение, что программа звершила работу штатно + print(f'Program has finished properly') From c0f289eab82f44134246f49eddc884f705bb259d Mon Sep 17 00:00:00 2001 From: SergeyZ06 Date: Sun, 24 Jan 2021 19:35:03 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F:=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8C=D0=B5=D0=B3=D0=BE=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8th hometask/3th task.py | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 8th hometask/3th task.py diff --git a/8th hometask/3th task.py b/8th hometask/3th task.py new file mode 100644 index 0000000..05782ba --- /dev/null +++ b/8th hometask/3th task.py @@ -0,0 +1,43 @@ +# Исключение для ловли символов, претворяющихся числами +class MyStrangeException(Exception): + def __init__(self, strange_message): + self.strange_message = strange_message + + +# Список для хранения чисел, вводимых пользователем +list_digits = [] +# Переменная для промежуточного хранения вводимого символа +var_input = 0 + +print(f'Hello there!') +print(f'You can type some digits one by one with pressing Enter') +print(f'Note: we will check them all!') + +# Цикл выполняется до обнаружения стоп-слова +while True: + # Запрос символа у пользователя + var_input = input(f'Type digit please. If you wanna stop, type "stop": ') + + # Если пользователь ввёл стоп-слово + if var_input == 'stop': + # вывывести сообщение, что стоп-слово обнаружено, что будет выведен список введённых чисел + print(f'"stop" has been detected, lets look list of digits:') + # вывести список введённых чисел + print(list_digits) + # прервать цикл + break + + # Пробовать + try: + # проверить, если символ является числом + if var_input.isdigit(): + # добавить в список новый элемент - символ, преобразованный в число + list_digits.append(int(var_input)) + # если символ оказался не числом + else: + # поднять исключение для ловли символов-нарушителей + raise MyStrangeException(f'"{var_input}" does not look like digit, be careful next time!') + # перехватить исключение + except MyStrangeException as new_exception: + # вывести очень важное сообщение + print(new_exception.strange_message) From f718d4bd4b69fa656f240c593b9bfd92e8874b8d Mon Sep 17 00:00:00 2001 From: SergeyZ06 Date: Sun, 24 Jan 2021 20:26:05 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F:=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D0=B4=D1=8C?= =?UTF-8?q?=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8th hometask/7th task.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 8th hometask/7th task.py diff --git a/8th hometask/7th task.py b/8th hometask/7th task.py new file mode 100644 index 0000000..4613e78 --- /dev/null +++ b/8th hometask/7th task.py @@ -0,0 +1,40 @@ +# Класс Комплексное число +class ComplexNumber: + # Конструктор: получение вещественной и мнимой частей из параметров + def __init__(self, part_normal, part_complex): + # Сохранить вещественную часть + self.__part_normal = part_normal + # Сохранить мнимую часть + self.__part_complex = part_complex + + # Переопределение метода для отображения комплексного числа в строковом формате + def __str__(self): + return f'{self.__part_normal} + {self.__part_complex}i' + + # Переопределение метода сложения комплексных чисел + def __add__(self, other): + return ComplexNumber(self.__part_normal + other.__part_normal, self.__part_complex + other.__part_complex) + + # Переопределение метода умножения комплексных чисел + def __mul__(self, other): + return ComplexNumber(self.__part_normal * other.__part_normal - self.__part_complex * other.__part_complex, + self.__part_normal * other.__part_complex + self.__part_complex * other.__part_normal) + + +# Создание комплексного числа а и его отображение +complex_a = ComplexNumber(1, 2) +print(f'a =\t\t{complex_a}') + +# Создание комплексного числа б и его отображение +complex_b = ComplexNumber(3, 4) +print(f'b =\t\t{complex_b}') + +# Переопределение комплексного чисола а: +# теперь комплексное число а равно сумме самого себя и комплексного числа б +complex_a = complex_a + complex_b +print(f'a = a + b =\t\t{complex_a}') + +# Переопределение комплексного числа б: +# теперь комплексное число б равно произведению самого себя и комплексного чисола а +complex_b = complex_a * complex_b +print(f'b = a * b =\t\t{complex_b}') From b81e3a69a6fb50ed69ac2628c167a0150f0d44d7 Mon Sep 17 00:00:00 2001 From: SergeyZ06 Date: Tue, 26 Jan 2021 22:29:36 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F:=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=87=D0=B5=D1=82=D0=B2?= =?UTF-8?q?=D1=91=D1=80=D1=82=D0=BE=D0=B3=D0=BE,=20=D0=BF=D1=8F=D1=82?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE,=20=D1=88=D0=B5=D1=81=D1=82=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8th hometask/4th task.py | 48 ++++++++++ 8th hometask/5th task.py | 120 ++++++++++++++++++++++++ 8th hometask/6th task.py | 193 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 361 insertions(+) create mode 100644 8th hometask/4th task.py create mode 100644 8th hometask/5th task.py create mode 100644 8th hometask/6th task.py diff --git a/8th hometask/4th task.py b/8th hometask/4th task.py new file mode 100644 index 0000000..dd0e192 --- /dev/null +++ b/8th hometask/4th task.py @@ -0,0 +1,48 @@ +# Класс Склад +# store_id - номер склада, целочисленный атрибут +# store_capacity - вместимость склада, целочисленный атрибут +# store_description - краткое описание склада, опциональный строковый атрибут +class StorehouseOfficeDevice: + def __init__(self, store_id, store_capacity, store_description=None): + self.store_id = store_id + self.store_capacity = store_capacity + self.store_description = store_description + + +# Класс Оргтехника +# model - модель, стоковый атрибут +# cost - стоимость в долларах, числовой атрибут +# maker - производитель, опциональный строковый атрибут +class OfficeDevice: + def __init__(self, model, cost, maker=None): + self.model, self.cost, self.maker = model, cost, maker + + +# Класс Принтер +# Наследует все атрибуты класса Ортехника +# color - цвет печати, строковый атрибут +class Printer(OfficeDevice): + def __init__(self, model, cost, color, maker=None): + self.color = color + super(Printer, self).__init__(model, cost, maker) + + +# Класс Сканер +# Наследует все атрибуты класса Ортехника +# size - диагональ сканера в дюймах, числовой атрибут +class Scanner(OfficeDevice): + def __init__(self, model, cost, size, maker=None): + self.size = size + super(Scanner, self).__init__(model, cost, maker) + + +# Класс Ксерокс +# Наследует все атрибуты класса Ортехника +# paper_format - типы используемой бумаги, список строк +class Xerox(OfficeDevice): + def __init__(self, model, cost, *paper_format, maker=None): + self.paper_format = paper_format + super(Xerox, self).__init__(model, cost, maker) + + +pass diff --git a/8th hometask/5th task.py b/8th hometask/5th task.py new file mode 100644 index 0000000..ea7ec28 --- /dev/null +++ b/8th hometask/5th task.py @@ -0,0 +1,120 @@ +from abc import abstractmethod + + +# Класс Склад +# store_id - код склада, целочисленный атрибут +# store_capacity - вместимость склада, целочисленный атрибут +# store_description - краткое описание склада, опциональный строковый атрибут +# dict_stored_devices - словарь для хранения информации о размещении оргтехники в подразделении: +# код оргтехники: код подразделения +class StorehouseOfficeDevice: + def __init__(self, store_id, store_capacity, store_description=None): + self.store_id = store_id + self.store_capacity = store_capacity + self.store_description = store_description + self.dict_stored_devices = {} + + # Метод Получить оргтехнику + # device_id - список кодов оргтехники + def get_device(self, *device_id): + for key in device_id: + self.dict_stored_devices[key] = self.store_id + + # Метод Переместить оргтехнику + # device_id - словарь с информацией о перемещении: + # код оргтехники: код подразделения + def relocate_device(self, **device_id): + for key in device_id.keys(): + self.dict_stored_devices[key] = device_id.get(key) + # Здесь наверно нужно вызвать метод оргтехники Переместить оргтехнику, + # но не понимаю как можно реализовать обращение к ещё не объявленному объекту класса Оргтехника + # Printer.relocate_device(device_id.get(key)) + # Scanner.relocate_device(device_id.get(key)) + # Xerox.relocate_device(device_id.get(key)) + + +# Класс Оргтехника +# device_id - код оргтехники +# model - модель, стоковый атрибут +# cost - стоимость в долларах, числовой атрибут +# maker - производитель, опциональный строковый атрибут +class OfficeDevice: + def __init__(self, device_id, location, model, cost, maker=None): + self.device_id, self.location, self.model, self.cost, self.maker = device_id, location, model, cost, maker + + # Метод Амортизация оргтехники + @abstractmethod + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + @abstractmethod + def relocate_device(self, location): + self.location = location + + +# Класс Принтер +# Наследует все атрибуты класса Ортехника +# color - цвет печати, строковый атрибут +class Printer(OfficeDevice): + def __init__(self, device_id, location, model, cost, color, maker=None): + self.color = color + super(Printer, self).__init__(device_id, location, model, cost, maker) + + # Метод Амортизация оргтехники + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + def relocate_device(self, location): + self.location = location + + +# Класс Сканер +# Наследует все атрибуты класса Ортехника +# size - диагональ сканера в дюймах, числовой атрибут +class Scanner(OfficeDevice): + def __init__(self, device_id, location, model, cost, size, maker=None): + self.size = size + super(Scanner, self).__init__(device_id, location, model, cost, maker) + + # Метод Амортизация оргтехники + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + def relocate_device(self, location): + self.location = location + + +# Класс Ксерокс +# Наследует все атрибуты класса Ортехника +# paper_format - типы используемой бумаги, список строк +class Xerox(OfficeDevice): + def __init__(self, device_id, location, model, cost, *paper_format, maker=None): + self.paper_format = paper_format + super(Xerox, self).__init__(device_id, location, model, cost, maker) + + # Метод Амортизация оргтехники + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + def relocate_device(self, location): + self.location = location + + +# Класс Подразделение +# division_id - код подразделения, целочисленный атрибут +# division_description - краткое описание подразделения, опциональный строковый атрибут +class Division: + def __init__(self, division_id, division_description=None): + self.division_id, self.division_description = division_id, division_description + self.list_devices_in_use = [] + + # Метод Получить оргтехнику + def get_device(self, device_id): + self.list_devices_in_use.append(device_id) + + +pass diff --git a/8th hometask/6th task.py b/8th hometask/6th task.py new file mode 100644 index 0000000..0bfe27c --- /dev/null +++ b/8th hometask/6th task.py @@ -0,0 +1,193 @@ +from abc import abstractmethod + + +# Класс Исключение при некорректном вводе кода оргтехники +class ExceptionDeviceID(Exception): + def __init__(self, message): + self.message = message + + +# Класс Склад +# store_id - код склада, целочисленный атрибут +# store_capacity - вместимость склада, целочисленный атрибут +# store_description - краткое описание склада, опциональный строковый атрибут +# dict_stored_devices - словарь для хранения информации о размещении оргтехники в подразделении: +# код оргтехники: код подразделения +class StorehouseOfficeDevice: + # ========== + # Попытка сделать обращения между разными классами при помощи словаря класса, а не объекта + # Далее код попытки будет оформлен данными символами + # ========== + global_dict_stored_devices = {} + + def __init__(self, store_id, store_capacity, store_description=None): + self.store_id = store_id + self.store_capacity = store_capacity + self.store_description = store_description + self.dict_stored_devices = {} + + # Метод Получить оргтехнику + # device_id - список кодов оргтехники + def get_device(self, *device_id): + for key in device_id: + self.dict_stored_devices[key] = self.store_id + StorehouseOfficeDevice.global_dict_stored_devices[key] = self.store_id + + # Метод Переместить оргтехнику + # device_id - словарь с информацией о перемещении: + # код оргтехники: код подразделения + def relocate_device(self, **device_id): + for key in device_id.keys(): + self.dict_stored_devices[key] = device_id.get(key) + # Здесь наверно нужно вызвать метод оргтехники Переместить оргтехнику, + # но не понимаю как можно реализовать обращение к ещё не объявленному объекту класса Оргтехника + # Printer.relocate_device(device_id.get(key)) + # Scanner.relocate_device(device_id.get(key)) + # Xerox.relocate_device(device_id.get(key)) + StorehouseOfficeDevice.global_dict_stored_devices[key] = device_id.get(key) + + +# Класс Оргтехника +# device_id - код оргтехники, целочисленный атрибут +# model - модель, стоковый атрибут +# cost - стоимость в долларах, числовой атрибут +# maker - производитель, опциональный строковый атрибут +class OfficeDevice: + def __init__(self, device_id, location, model, cost, maker=None): + self.device_id, self.location, self.model, self.cost, self.maker = device_id, location, model, cost, maker + + # Метод Амортизация оргтехники + @abstractmethod + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + @abstractmethod + def relocate_device(self, location): + self.location = location + # ========== + # Обращение к словарю класса + # ========== + StorehouseOfficeDevice.global_dict_stored_devices[self.device_id] = location + + +# Класс Принтер +# Наследует все атрибуты класса Ортехника +# color - цвет печати, строковый атрибут +class Printer(OfficeDevice): + def __init__(self, device_id, location, model, cost, color, maker=None): + # Проверка ввода кода оргтехники + try: + # Если переданный параметр целочисленный + if device_id.isdigit(): + # записать значение параметра в атрибут оргтехники + self.color = color + super(Printer, self).__init__(device_id, location, model, cost, maker) + # иначе + else: + # поднять исключение + raise ExceptionDeviceID(f'Device ID "{device_id}" specified incorrect.') + # Перехватить исключение + except ExceptionDeviceID as error: + # вывести сообщение об ошибке + print(error.message) + + # Метод Амортизация оргтехники + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + def relocate_device(self, location): + self.location = location + # ========== + # Обращение к словарю класса + # ========== + StorehouseOfficeDevice.global_dict_stored_devices[self.device_id] = location + + +# Класс Сканер +# Наследует все атрибуты класса Ортехника +# size - диагональ сканера в дюймах, числовой атрибут +class Scanner(OfficeDevice): + def __init__(self, device_id, location, model, cost, size, maker=None): + # Проверка ввода кода оргтехники + try: + # Если переданный параметр целочисленный + if device_id.isdigit(): + # записать значение параметра в атрибут оргтехники + self.size = size + super(Scanner, self).__init__(device_id, location, model, cost, maker) + # иначе + else: + # поднять исключение + raise ExceptionDeviceID(f'Device ID "{device_id}" specified incorrect.') + # Перехватить исключение + except ExceptionDeviceID as error: + # вывести сообщение об ошибке + print(error.message) + + # Метод Амортизация оргтехники + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + def relocate_device(self, location): + self.location = location + # ========== + # Обращение к словарю класса + # ========== + StorehouseOfficeDevice.global_dict_stored_devices[self.device_id] = location + + +# Класс Ксерокс +# Наследует все атрибуты класса Ортехника +# paper_format - типы используемой бумаги, список строк +class Xerox(OfficeDevice): + def __init__(self, device_id, location, model, cost, *paper_format, maker=None): + # Проверка ввода кода оргтехники + try: + # Если переданный параметр целочисленный + if device_id.isdigit(): + # записать значение параметра в атрибут оргтехники + self.paper_format = paper_format + super(Xerox, self).__init__(device_id, location, model, cost, maker) + # иначе + else: + # поднять исключение + raise ExceptionDeviceID(f'Device ID "{device_id}" specified incorrect.') + # Перехватить исключение + except ExceptionDeviceID as error: + # вывести сообщение об ошибке + print(error.message) + + # Метод Амортизация оргтехники + def discount(self): + self.cost = self.cost * 0.9 + + # Метод Переместить оргтехнику + def relocate_device(self, location): + self.location = location + # ========== + # Обращение к словарю класса + # ========== + StorehouseOfficeDevice.global_dict_stored_devices[self.device_id] = location + + +# Класс Подразделение +# division_id - код подразделения, целочисленный атрибут +# division_description - краткое описание подразделения, опциональный строковый атрибут +class Division: + def __init__(self, division_id, division_description=None): + self.division_id, self.division_description = division_id, division_description + self.list_devices_in_use = [] + + # Метод Получить оргтехнику + def get_device(self, device_id): + self.list_devices_in_use.append(device_id) + # ========== + # Обращение к словарю класса + # ========== + StorehouseOfficeDevice.global_dict_stored_devices[device_id] = self.division_id + + +pass From 71f406e6480cac10ef18a77015feb2f6ecc11467 Mon Sep 17 00:00:00 2001 From: SergeyZ06 Date: Sun, 7 Feb 2021 21:22:34 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F:=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F.=20=D0=A2=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D0=B5=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B0=20=D0=94=D0=B0=D1=82=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B5.=20=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=B2=D1=8B=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=B1=D1=83=D0=B5=D1=82=D1=81=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8th hometask/1th task.py | 51 ++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/8th hometask/1th task.py b/8th hometask/1th task.py index d7f48e8..29a30a7 100644 --- a/8th hometask/1th task.py +++ b/8th hometask/1th task.py @@ -12,7 +12,20 @@ class Date: # Конструктор: записывает дату из параметра в атрибут объекта def __init__(self, str_data='01-01-1900'): - self.str_date = str_data + dict_date = Date.date_to_numeric(str_data) + dict_date = self.date_validation(dict_date) + + for index in Date.dict_parts_of_date.keys(): + if dict_date[Date.dict_parts_of_date[index]] is None: + print(f'Object "{str_data}" was not created successfully') + print(f'Part "{Date.dict_parts_of_date[index]}" of "{str_data}" is not correct') + self.dict_date = None + break + else: + self.dict_date = dict_date + + if self.dict_date is not None: + print(f'Object "{str_data}" was created successfully') # Метод Преобразования строчной записи даты в словарь с частями даты # Принимает в качестве параметра строковую запись даты @@ -43,53 +56,45 @@ def date_to_numeric(cls, str_to_int): # Метод Проверки даты # Принимает в качестве параметра строковую запись даты @staticmethod - def date_validation(str_to_validate): - # Преобразовать строковую запись даты в словарь с частями даты - dict_to_validate = Date.date_to_numeric(str_to_validate) - + def date_validation(dict_to_validate): # Пробовать try: # оценить часть даты "День" if dict_to_validate['day'] < 1 or dict_to_validate['day'] > 31: - # в случае некорректного значения вывести сообщение - print(f'Part "day" of {str_to_validate} is not correct') + # в случае некорректного значения убрать значение + dict_to_validate['day'] = None # в случае невозможности сравнения except TypeError: - # вывести сообщение - print(f'Part "day" of {str_to_validate} is not correct') + # убрать значение + dict_to_validate['day'] = None # Аналогичная проверка для части даты "Месяц" try: if dict_to_validate['month'] < 1 or dict_to_validate['month'] > 12: - print(f'Part "month" of {str_to_validate} is not correct') + dict_to_validate['month'] = None except TypeError: - print(f'Part "month" of {str_to_validate} is not correct') + dict_to_validate['month'] = None # Аналогичная проверка для части даты "Год" try: if dict_to_validate['year'] < 1900 or dict_to_validate['year'] > 2100: - print(f'Part "year" of {str_to_validate} is not correct') + dict_to_validate['year'] = None except TypeError: - print(f'Part "year" of "{str_to_validate}" is not correct') + dict_to_validate['year'] = None + + return dict_to_validate # Создать объект класса Дата new_date = Date(f'{randint(1, 30):02}-{randint(1, 12):02}-{randint(1900, 2100)}') -# Отобразить содержимое объекта -print(new_date.str_date) -# Отобразить результат рабты метода Преобразования -print(Date.date_to_numeric(new_date.str_date)) -# Вызвать метод Проверки даты -Date.date_validation(new_date.str_date) +print(new_date.dict_date) # Создать объект класса Дата с заведомо некорректным годом print() new_date_2 = Date(f'01-01-2oo5') -print(Date.date_to_numeric(new_date_2.str_date)) -Date.date_validation(new_date_2.str_date) +print(new_date_2.dict_date) # Создать объект класса Дата с заведомо некорректными днём и годом print() new_date_3 = Date(f'00-10-2200') -print(Date.date_to_numeric(new_date_3.str_date)) -Date.date_validation(new_date_3.str_date) +print(new_date_3.dict_date)