From 910714c26e37eaba3fe4a72787f71d135c260ae2 Mon Sep 17 00:00:00 2001 From: Yuriy-Zhitkov Date: Sat, 5 Jun 2021 02:02:22 +0300 Subject: [PATCH] add Home work 08 files --- 08_OOP/Task_01.py | 32 ++++++++++++ 08_OOP/Task_02.py | 24 +++++++++ 08_OOP/Task_03.py | 47 ++++++++++++++++++ 08_OOP/Task_04-06.py | 115 +++++++++++++++++++++++++++++++++++++++++++ 08_OOP/Task_04.py | 70 ++++++++++++++++++++++++++ 08_OOP/Task_05.py | 106 +++++++++++++++++++++++++++++++++++++++ 08_OOP/Task_07.py | 37 ++++++++++++++ 7 files changed, 431 insertions(+) create mode 100644 08_OOP/Task_01.py create mode 100644 08_OOP/Task_02.py create mode 100644 08_OOP/Task_03.py create mode 100644 08_OOP/Task_04-06.py create mode 100644 08_OOP/Task_04.py create mode 100644 08_OOP/Task_05.py create mode 100644 08_OOP/Task_07.py diff --git a/08_OOP/Task_01.py b/08_OOP/Task_01.py new file mode 100644 index 0000000..7fe257b --- /dev/null +++ b/08_OOP/Task_01.py @@ -0,0 +1,32 @@ +''' +Реализовать класс «Дата», функция-конструктор которого должна принимать дату в виде строки формата «день-месяц-год». +В рамках класса реализовать два метода. +Первый, с декоратором @classmethod, должен извлекать число, месяц, год и преобразовывать их тип к типу «Число». +Второй, с декоратором @staticmethod, должен проводить валидацию числа, месяца и года (например, месяц — от 1 до 12). +Проверить работу полученной структуры на реальных данных. +''' + +class Data: + + def __init__(self, datatata: str): + self.datatata = datatata + + def data(self): + return list(map(int, self.data_int(self.datatata))) + + @staticmethod + def data_int(some_data: str): + return (some_data.split('-')) + + + + + +my_data = Data('23-05-89') +print(my_data.data()) + + + + + + diff --git a/08_OOP/Task_02.py b/08_OOP/Task_02.py new file mode 100644 index 0000000..84ef7ac --- /dev/null +++ b/08_OOP/Task_02.py @@ -0,0 +1,24 @@ +''' +Создайте собственный класс-исключение, обрабатывающий ситуацию деления на нуль. +Проверьте его работу на данных, вводимых пользователем. +При вводе пользователем нуля в качестве делителя программа должна корректно обработать эту ситуацию и +не завершиться с ошибкой. +''' + +class DivZero(Exception): + + def __init__(self, txt): + self.txt = txt + + +def a(a,b): + if b == 0: + raise DivZero('Ошибка. Деление на ноль') + else: + return print(a / b) + + +try: + a(1, 0) +except Exception as e: + print(e) \ No newline at end of file diff --git a/08_OOP/Task_03.py b/08_OOP/Task_03.py new file mode 100644 index 0000000..6af7414 --- /dev/null +++ b/08_OOP/Task_03.py @@ -0,0 +1,47 @@ +''' +Создайте собственный класс-исключение, который должен проверять содержимое списка на наличие только чисел. +Проверить работу исключения на реальном примере. Необходимо запрашивать у пользователя данные и заполнять список. +Класс-исключение должен контролировать типы данных элементов списка. + +Примечание: длина списка не фиксирована. Элементы запрашиваются бесконечно, пока пользователь сам не остановит +работу скрипта, введя, например, команду “stop”. При этом скрипт завершается, сформированный список выводится на экран. + +Подсказка: для данного задания примем, что пользователь может вводить только числа и строки. При вводе пользователем +очередного элемента необходимо реализовать проверку типа элемента и вносить его в список, только если введено число. +Класс-исключение должен не позволить пользователю ввести текст (не число) и отобразить соответствующее сообщение. +При этом работа скрипта не должна завершаться. +''' + +class ErrorIntList(Exception): + + def __init__(self, text): + self.text = text + + +class MyList: + + def input_list(self): + ''' + Ввод значений и проверка принадлежности значения к типу "число" + :return: список чисел + ''' + result = [] + while True: + try: + num = input('Введите число (q для выхода): ') + if num == 'q': + print('Программа завершена') + break + elif num.isdigit() == True: + result.append(num) + else: + raise ErrorIntList('Ошибка. Введите число!') + except Exception as e: + print(e) + print(result) + print(result) + + +some_list = MyList() # создаю экземпляр класса +some_list.input_list() # проверяю работу метода + diff --git a/08_OOP/Task_04-06.py b/08_OOP/Task_04-06.py new file mode 100644 index 0000000..522b95f --- /dev/null +++ b/08_OOP/Task_04-06.py @@ -0,0 +1,115 @@ +''' +Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. +А также класс «Оргтехника», который будет базовым для классов-наследников. +Эти классы — конкретные типы оргтехники (принтер, сканер, ксерокс). +В базовом классе определить параметры, общие для приведенных типов. +В классах-наследниках реализовать параметры, уникальные для каждого типа оргтехники. + +Продолжить работу над первым заданием. Разработать методы, отвечающие за приём оргтехники на склад и +передачу в определенное подразделение компании. Для хранения данных о наименовании и количестве единиц оргтехники, +а также других данных, можно использовать любую подходящую структуру, например словарь. + +Продолжить работу над вторым заданием. Реализуйте механизм валидации вводимых пользователем данных. +Например, для указания количества принтеров, отправленных на склад, нельзя использовать строковый тип данных. +''' + + +class Storage: + + display_list = [] + key_board_list = [] + mouse_list = [] + + def __init__(self, cells): + self.cells = cells + + + @staticmethod + def cell_busy(*args): # метод подсчета занятых ячеек + return sum([len(el) for el in args]) + + + def info(self): + print(f'Склад всего содержит {self.cells} ячеек') + print(f'Занято ячеек ') + + + +class Thing: + + + def __init__(self, prise: int, weight: int, size: str, nums: int): + self.nums = nums + self.size = size + self.weight = weight + self.prise = prise + + + def __str__(self): + return f'{self.__dict__}' + + + def move(self): + self.__dict__['place'] = input('Введите место, где находится предмет: ') + + +class Display(Thing): + + def __init__(self, diagonal: int, prise: int, weight: int, size: str, nums: int): + super().__init__(prise, weight, size, nums) + self.diagonal = diagonal + + @classmethod + def new(cls): + print('Введите информацию о мониторе: diagonal: дюймы, prise: рубли, weight: кг, size: д-ш-в, nums: шт') + description_thing = [input() for _ in range(5)] + return Storage.display_list.append(cls(*description_thing)) + + + + +class KeyBoard(Thing): + + def __init__(self, type_k: str ,prise: int, weight: int, size: str, nums: int): + super().__init__(prise, weight, size, nums) + self.type_k = type_k + + + @classmethod + def new(cls): + print('Введите информацию о клавиатуре: type_k: тип, prise: руб, weight: кг, size: д-ш-в, nums: шт') + description_thing = [input() for _ in range(5)] + return Storage.key_board_list.append(cls(*description_thing)) + + + +class Mouse(Thing): + + def __init__(self, type_m: str, prise: int, weight: int, size: str, nums: int): + super().__init__(prise, weight, size, nums) + self.type_m = type_m + + @classmethod + def new(cls): + print('Введите информацию о мышке: type_m: тип, prise: руб, weight: кг, size: д-ш-в, nums: шт') + description_thing = [input() for _ in range(5)] + return Storage.mouse_list.append(cls(*description_thing)) + + + + + + +# Добавление новых товаров +a = Display.new() +b = KeyBoard.new() +c = Mouse.new() + +# Вывод на экран (для проверки) +print(Storage.display_list[0]) +print(Storage.key_board_list[0]) +print(Storage.mouse_list[0]) + +# Перемещение товара на новое место +Storage.display_list[0].move() +print(Storage.display_list[0]) \ No newline at end of file diff --git a/08_OOP/Task_04.py b/08_OOP/Task_04.py new file mode 100644 index 0000000..a7304ef --- /dev/null +++ b/08_OOP/Task_04.py @@ -0,0 +1,70 @@ +''' +Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. +А также класс «Оргтехника», который будет базовым для классов-наследников. +Эти классы — конкретные типы оргтехники (принтер, сканер, ксерокс). +В базовом классе определить параметры, общие для приведенных типов. +В классах-наследниках реализовать параметры, уникальные для каждого типа оргтехники. +''' + +class Storage: + + def __init__(self, cells): + self.cells = cells + + + @staticmethod + def cell_busy(*args): # метод подсчета занятых ячеек + return sum([el for el in args]) + + + + def info(self): + print(f'Склад всего содержит {self.cells} ячеек') + print(f'Занято ячеек ') + + + +class Thing: + + def __init__(self, prise: int, weight: int, size: list, nums: int): + self.nums = nums + self.size = size + self.weight = weight + self.prise = prise + + +class Display(Thing): + + def __init__(self, diagonal: int, prise: int, weight: int, size: list, nums: int): + super().__init__(prise, weight, size, nums) + self.diagonal = diagonal + + +class KeyBoard(Thing): + + def __init__(self, type_k: str ,prise: int, weight: int, size: list, nums: int): + super().__init__(prise, weight, size, nums) + self.type_k = type_k + + +class Mouse(Thing): + + def __init__(self, type_m: str, prise: int, weight: int, size: list, nums: int): + super().__init__(prise, weight, size, nums) + self.type_m = type_m + + +storage_01 = Storage(150) +storage_01.info() + +mouse_01 = Mouse('оптическая', 1500, 150, [6, 5, 4], 13) +key_board_01 = KeyBoard('оптическая', 2500, 700, [36, 18, 2], 15) +display_01 = Display(37, 2500, 700, [36, 18, 2], 56) + + +a = storage_01.cell_busy(mouse_01.nums, key_board_01.nums,display_01.nums) +print(a) + + + + diff --git a/08_OOP/Task_05.py b/08_OOP/Task_05.py new file mode 100644 index 0000000..757d3db --- /dev/null +++ b/08_OOP/Task_05.py @@ -0,0 +1,106 @@ +''' + Продолжить работу над первым заданием. Разработать методы, отвечающие за приём оргтехники на склад и + передачу в определенное подразделение компании. Для хранения данных о наименовании и количестве единиц оргтехники, + а также других данных, можно использовать любую подходящую структуру, например словарь. +''' + + +class Storage: + + display_list = [] + key_board_list = [] + mouse_list = [] + + def __init__(self, cells): + self.cells = cells + + + @staticmethod + def cell_busy(*args): # метод подсчета занятых ячеек + return sum([len(el) for el in args]) + + + def info(self): + print(f'Склад всего содержит {self.cells} ячеек') + print(f'Занято ячеек ') + + + +class Thing: + + + def __init__(self, prise: int, weight: int, size: str, nums: int): + self.nums = nums + self.size = size + self.weight = weight + self.prise = prise + + + def __str__(self): + return f'{self.__dict__}' + + + def move(self): + self.__dict__['place'] = input('Введите место, где находится предмет: ') + + +class Display(Thing): + + def __init__(self, diagonal: int, prise: int, weight: int, size: str, nums: int): + super().__init__(prise, weight, size, nums) + self.diagonal = diagonal + + @classmethod + def new(cls): + print('Введите информацию о мониторе: diagonal: дюймы, prise: рубли, weight: кг, size: д-ш-в, nums: шт') + description_thing = [input() for _ in range(5)] + return Storage.display_list.append(cls(*description_thing)) + + + + +class KeyBoard(Thing): + + def __init__(self, type_k: str ,prise: int, weight: int, size: str, nums: int): + super().__init__(prise, weight, size, nums) + self.type_k = type_k + + + @classmethod + def new(cls): + print('Введите информацию о клавиатуре: type_k: тип, prise: руб, weight: кг, size: д-ш-в, nums: шт') + description_thing = [input() for _ in range(5)] + return Storage.key_board_list.append(cls(*description_thing)) + + + +class Mouse(Thing): + + def __init__(self, type_m: str, prise: int, weight: int, size: str, nums: int): + super().__init__(prise, weight, size, nums) + self.type_m = type_m + + @classmethod + def new(cls): + print('Введите информацию о мышке: type_m: тип, prise: руб, weight: кг, size: д-ш-в, nums: шт') + description_thing = [input() for _ in range(5)] + return Storage.mouse_list.append(cls(*description_thing)) + + + + + + +# Добавление новых товаров +a = Display.new() +b = KeyBoard.new() +c = Mouse.new() + +# Вывод на экран (для проверки) +print(Storage.display_list[0]) +print(Storage.key_board_list[0]) +print(Storage.mouse_list[0]) + +# Перемещение товара на новое место +Storage.display_list[0].move() +print(Storage.display_list[0]) \ No newline at end of file diff --git a/08_OOP/Task_07.py b/08_OOP/Task_07.py new file mode 100644 index 0000000..18e66a1 --- /dev/null +++ b/08_OOP/Task_07.py @@ -0,0 +1,37 @@ +''' +Реализовать проект «Операции с комплексными числами». Создайте класс «Комплексное число», +реализуйте перегрузку методов сложения и умножения комплексных чисел. +Проверьте работу проекта, создав экземпляры класса (комплексные числа) и выполнив сложение и умножение созданных экземпляров. +Проверьте корректность полученного результата. +''' + +class Complex: + + def __init__(self, r, i): + self.r = r + self.i = i + + def __str__(self): + return (f'{self.r}+{self.i}i', f'{self.r}{self.i}i')[self.i < 0] + + def __add__(self, other): + return Complex((self.r + other.r), (self.i + other.i)) + + def __mul__(self, other): + return Complex((self.r * other.r - self.i + other.i), (self.i * other.r + self.r + other.i)) + + + +a = Complex(2, 3) +b = Complex(-1, 0) +print(a) +print(b) + +c = a + b +d = a * b +print(c) +print(d) + + + +