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

3 семестр / laba_7

.py
Скачиваний:
1
Добавлен:
20.03.2025
Размер:
3.08 Кб
Скачать
from abc import ABC, abstractmethod
import math


class Shape(ABC):
    def __init__(self, num_vertices):
        self.num_vertices = num_vertices
        self.name = self.__class__.__name__
        self.perimeter = self.calculate_perimeter()
        self.area = self.calculate_area()
        self.is_symmetric = self.check_symmetry()
        self.description = self.generate_description()
        self.__value = 1
        self.__value2 = 5

    @abstractmethod
    def calculate_perimeter(self):
        pass

    @abstractmethod
    def calculate_area(self):
        pass

    @abstractmethod
    def check_symmetry(self):
        pass

    def func(self):
        self.__value = 'any_1'
        return self.__value

    def func2(self):
        return self.__value2

    def generate_description(self):
        return f"{self.name} с {self.num_vertices} сторонами, периметр {self.perimeter}, площадь {self.area}, симметрия: {self.is_symmetric}"
    value_read1 = property(func)
    value_read2 = property(func2)



def shape_selector(func):
    def wrapper(*args, **kwargs):
        shape_name = func(*args, **kwargs)
        shape_classes = {cls.__name__.lower(): cls for cls in Shape.__subclasses__()}
        if shape_name.lower() not in shape_classes:
            similar_names = [name for name in shape_classes if shape_name.lower() in name]
            if similar_names:
                print(f"Может ты имел в виду что-то такое: {', '.join(similar_names)}?")
                chosen_name = input("Уточните фигуру: ").strip().lower()
                if chosen_name in shape_classes:
                    return shape_classes[chosen_name]
            print("Фигура некорректна")
            return None
        return shape_classes[shape_name.lower()]
    return wrapper


@shape_selector
def get_shape_class(shape_name):
    return shape_name


class Heptagon(Shape):
    def calculate_perimeter(self):
        return self.num_vertices * 0.32

    def calculate_area(self):
        return ((7*0.32)**2)/(4*math.tan(math.pi/7))

    def check_symmetry(self):
        return True


class Square(Shape):
    def calculate_perimeter(self):
        return self.num_vertices * 0.32

    def calculate_area(self):
        return self.num_vertices ** 2

    def check_symmetry(self):
        return True


while True:
    shape_name = input("Напишите название фигуры на английском: ").strip().lower()

    if shape_name == 'exit':
        break

    ShapeClass = get_shape_class(shape_name)
    if ShapeClass:
        num_vertices = int(input(f"Количество сторон: {shape_name}: "))
        shape_instance = ShapeClass(num_vertices)
        print(shape_instance.description)
        print('Демонстрирую использование переменной для чтения:', shape_instance.value_read1, shape_instance.value_read2)
Соседние файлы в папке 3 семестр