Задать вопрос

Соответствует ли мой код парадигме ООП?

Изучаю Python, пытаюсь вникнуть с суть программирования как такового, в частности освоить ООП. Приведённый мной код работает, можете особо в его суть не вникать (он просто рисует в консоли треугольник и квадрат заданной пользователем высоты). Меня интересует, соответсвует ли сие творение парадигме ООП, а конкретно реализован ли в данном варианте принцип полиморфизма. Определение полиморфизма которое я нашел вот: "polymorphism is the ability (in programming) to present the same interface for differing underlying forms (data types) / полиморфизмом называют способность (в программировании) представлять один и тот же интерфейс для разных базовых форм (типов данных)." Я пока не особо владею синтаксисом питона и сомневаюсь что правильно предоставил один и тот же интерфейс (class Drawer) для двух типов данных (class Triangle, class Square), как завещает это определение. Если я ошибся, объясните пожалуйста, что будет сделать правильнее, используя парадигму ООП, для реализации функционала, который предоставляет мой код, ну или какой-нибудь свой пример покажите.

class Drawer:
    def __init__(self, figure, elements, height):
        self.figure = figure
        self.elements = elements
        self.height = height

    def execute(self):
        if self.figure == "triangle":
            structure = [" " * (self.height - 1) + self.elements[0] + self.elements[2] + "\n"]
            string = 1
            padding = self.height - 1
            while string < self.height:
                if string + 1 == self.height:
                    structure.append(self.elements[0] + self.elements[1] * (self.height - 1) + self.elements[2])
                else:
                    structure.append(" " * (padding - 1) + self.elements[0] + " " * string + self.elements[2] + "\n")
                string += 1
                padding -= 1
            return print("".join(structure))
        elif self.figure == "square":
            structure = [self.elements[0] + self.elements[1] * (self.height + 1) + self.elements[0] + "\n"]
            string = 1
            while string < self.height:
                if string + 1 == self.height:
                    structure.append(self.elements[0] + self.elements[2] * (self.height + 1) + self.elements[0])
                else:
                    structure.append(self.elements[0] + " " * (self.height + 1) + self.elements[0] + "\n")
                string += 1
            return print("".join(structure))


class Triangle:
    def __init__(self, height=2):
        self.elements = ["/", "_", "|"]
        self.height = height

    def draw(self):
        draw = Drawer("triangle", self.elements, self.height)
        draw.execute()


class Square:
    def __init__(self, height=2):
        self.elements = ["|", "`", "."]
        self.height = height

    def draw(self):
        draw = Drawer("square", self.elements, self.height)
        draw.execute()


t1 = Triangle(10)
sq1 = Square(10)
t1.draw()
print()
sq1.draw()
  • Вопрос задан
  • 647 просмотров
Подписаться 2 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
longclaps
@longclaps
Совсем нет.
Мне не хочется переделывать твой код построчно, он плох (это нормально, а то, что он работает - просто отлично). Надо бы как-то так:
from abc import ABC, abstractmethod
from math import sin, cos, pi


class Figure(ABC):
    def __init__(self, height=2):
        assert 1 < height < 20  # незачем больше
        self.height = height

    @abstractmethod
    def draw(self):
        pass


class Triangle(Figure):
    def draw(self):
        for i in range(self.height - 1):
            print(f'{"/":>{self.height - i}}{"":>{i * 2}}\\')
        print('─' * (self.height * 2))


class Square(Figure):
    def draw(self):
        w = self.height * 2 - 2
        print('┌', '┐', sep='─' * w)
        for _ in range(self.height - 2):
            print('│', '│', sep=' ' * w)
        print('└', '┘', sep='─' * w)


class Ellipse(Figure):
    def __init__(self, height=7, width=None):
        assert 6 < height < 20  # меньше никак
        if width is None:
            width = height
        else:
            assert 6 < width < 20
        self.height, self.width = height, width

    def draw(self):
        buf = [[' '] * (self.width * 2) for _ in range(self.height)]
        rx, ry = self.width - 1., self.height / 2 - .5
        for i in range(100):
            φ = i * pi / 50
            buf[round(ry * (1 + sin(φ)))][round(rx * (1. + cos(φ)))] = '*'
        for row in buf:
            print(''.join(row))


Triangle(7).draw()
Square(7).draw()
Ellipse(7).draw()
Ellipse(17, 7).draw()

Смотри на иерархию классов, о реализации методов не запаривайся.
Ответ написан
@stictt
просто рак
ООП как парадигма требует строгую наследственность, ее нет, то это не ООП, как бы вас это не смущало )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы