Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Python 2 / Лаба 6 / Лабораторная №6

.docx
Скачиваний:
0
Добавлен:
10.05.2024
Размер:
297.87 Кб
Скачать

Лабораторная работа №6

Цель работы: ознакомление и практическое использование наследования, полиморфизма, инкапсуляции классов Python.

Ход работы

Задание:

14) Создать класс OnlineStoreItem (элемент интернет-магазина) с приватными полями: название товара, цена, количество на складе. Реализовать функцию для определения товара с наибольшим количеством единиц на складе, а также функцию для расчета общей стоимости всех товаров в магазине.

Решить задачу используя классы, конструктор классов, наследование классов.

А) За основу берем выполненную задачу из лабораторной работы №5

Б) Добавить два новых классов (подклассов), первый наследует класс прародитель (созданный в л.р №5), второй класс наследует предыдущий класс. В созданных классах должны быть собственные приватные атрибуты (минимум 3).

В) Реализовать заполнение приватных атрибутов классов с помощью файла.

Г) Реализовать функционал изменение приватных атрибутов классов в основной программе. Можно реализовать по формату вызов функции, передача в аргумент: индекс элемента массива класса, новые значения.

Д) Для одного из классов попробовать создать еще один конструктор, проанализировать полученный результат. Реализовать работу программы по аналогии с двумя конструкторами, чтобы в зависимости от передаваемых аргументов в конструктор (возможно значений) менялась инициализация класса.

Е) Реализовать в основном классе хоты бы 1 метод @staticmethod (его можно использовать для решение какой-либо задачи из приведенных выше).

Ё) Используя @property реализовать геттер, сеттер, делетер для любого из приватных атрибутов.

Наследуемые атрибуты инициализировать с помощью super().

Пункт Д)

class Warehouse(OnlineStoreItem): class Warehouse(OnlineStoreItem): # Б) Д) def __init__(self, productName, price, countInStock, rack, cell, serialNumber): if cell <= 1000: super().__init__(productName, price, countInStock) # вызываем конструктор родительского класса self.__rack = rack self.__cell = cell self.__serialNumber = serialNumber else: # Присваиваем значения по умолчанию для cell и serialNumber default_cell = 1000 default_serialNumber = 1000 super().__init__(productName, price, countInStock) self.__rack = rack self.__cell = default_cell self.__serialNumber = default_serialNumber

При вызове конструктора класса Warehouse с передачей значения cell больше 1000 происходит изменение инициализации объекта. Вместо переданных значений cell и serialNumber будут использоваться значения по умолчанию.

Рисунок – Первое при cell>1000, второе при cell<1000

Блок-схемы программы

Рисунок 1 – Основная программа

Рисунок 2 – Метод Update_Product

Рисунок 3 – Метод deleter

Пример работы программы:

Рисунок 4 – Вывод в консоль

Рисунок 5 –Прочитанные данные из файла

Листинг программы:

class OnlineStoreItem: def __init__(self, productName, price, countInStock): self.__productName = productName self.__price = price self.__countInStock = countInStock #Ё) @property def product_name(self): return self.__productName @product_name.setter def product_name(self, name): if isinstance(name, str): self.__productName = name else: print("Недопустимое название") @property def price(self): return self.__price @price.setter def price(self, price): if isinstance(price, (int, float)): self.__price = price else: print("Недопустимое значение") @property def count_in_stock(self): return self.__countInStock @count_in_stock.setter def count_in_stock(self, count): if isinstance(count, int): self.__countInStock = count else: print("Недопустимое значение") #Г) @staticmethod def update_product(obj, index, argStr1=None, argInt1=None, argInt2=None, argStr2=None, argInt3=None, argInt4=None): if index < len(obj): if argStr1 is not None: obj[index].product_name = argStr1 if argInt1 is not None: obj[index].price = argInt1 if argInt2 is not None: obj[index].count_in_stock = argInt2 if argStr2 is not None: obj[index].rack = argStr2 if argInt3 is not None: obj[index].cell = argInt3 if argInt4 is not None: obj[index].serialNumber = argInt4 print("Продукт по индексу", index, "обновлен.") else: print("Индекс выходит за пределы массива.") return obj @staticmethod def deleter(objects, product_name): for obj in objects: if obj.product_name == product_name: objects.remove(obj) print(f"Товар '{product_name}' успешно удален из магазина.") return print(f"Товар '{product_name}' нет в магазине.") @staticmethod def write_to_file(content, fileName): with open(fileName, 'w+') as file: file.write(content) print("Данные записаны в файл", fileName) @staticmethod def write_summary(objects, fileName): summary = "" for product in objects: summary += f"Товар: {product.product_name}, Цена: {product.price}, Количество: {product.count_in_stock}\n" OnlineStoreItem.write_to_file(summary, fileName) # В) Е) @classmethod def read_from_file(obj, fileName): objects = [] with open(fileName, 'r') as file: for line in file: customer_name, price, products_count, rack, cell, serialNumber = line.strip().split(',') price = float(price) products_count = int(products_count) rack = str(rack) cell = int(cell) serialNumber = int(serialNumber) new_export = obj(customer_name, price, products_count, rack, cell, serialNumber) objects.append(new_export) return objects #подкласс наследник OnlineStoreItem class Warehouse(OnlineStoreItem): # Б) Д) def __init__(self, productName=None, price=None, countInStock=None, rack=None, cell=None, serialNumber=None): if cell <= 1000: super().__init__(productName, price, countInStock) # вызываем конструктор родительского класса self.__rack = rack self.__cell = cell self.__serialNumber = serialNumber else: # Присваиваем значения по умолчанию для cell и serialNumber default_cell = 1000 default_serialNumber = 1000 super().__init__(productName, price, countInStock) self.__rack = rack self.__cell = default_cell self.__serialNumber = default_serialNumber # Геттеры для атрибутов rack, cell и serialNumber @property def rack(self): return self.__rack @rack.setter def rack(self, rack): if isinstance(rack, str): self.__rack = rack else: print("Недопустимое название") @property def cell(self): return self.__cell @cell.setter def cell(self, cell): if isinstance(cell, (int, float)): self.__cell = cell else: print("Недопустимое значение") @property def serialNumber(self): return self.__serialNumber @serialNumber.setter def serialNumber(self, serialNumber): if isinstance(serialNumber, (int, float)): self.__serialNumber = serialNumber else: print("Недопустимое значение") # подкласс наследник Warehouse class Export(Warehouse): def set_product_export(self, product_export): self.__customer_name = product_export def set_SellingPrice(self, SellingPrice): self.__SellingPrice = SellingPrice def set_products_count(self, products_count): self.__products_count = products_count fileName = 'exports.txt' customer = Export.read_from_file(fileName) # Вызываем метод read_from_file из класса Export Export.write_summary(customer, "exports_summary.txt") # Вызываем метод write_summary objects = [ OnlineStoreItem('Phone', 300, 45), OnlineStoreItem('Tomato', 45, 132), OnlineStoreItem('Keyboard', 155, 73) ] objects = Export.update_product(objects, 2, 'Laptop', 500, 20) Export.deleter(objects, "Phone") fileName = 'exports2.txt' Export.write_summary(objects, "exports2.txt") # Вызываем метод write_summary item = Warehouse("Phone", 300, 45, "A1", 1005, 40) print(f"\nТовар: {item.product_name}, Цена: {item.price}, Количество: {item.count_in_stock}") print(f"Стелаж '{item.rack}', ячейка: {item.cell}, Серийный номер: {item.serialNumber}\n") item = Warehouse("Phone", 300, 45, "A1", 900, 40) print(f"Товар: {item.product_name}, Цена: {item.price}, Количество: {item.count_in_stock}") print(f"Стелаж '{item.rack}', ячейка: {item.cell}, Серийный номер: {item.serialNumber}") objects = [item] objects = Warehouse.update_product(objects, 0, None, None, 787, None, 543, 676) print(f"Стелаж '{item.rack}', ячейка: {item.cell}, Серийный номер: {item.serialNumber}")

Вывод: в ходе лабораторной работы ознакомились и практически использовали наследования, полиморфизм, инкапсуляции классов Python.