Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/75: Рейтинг темы: голосов - 75, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 08.04.2019
Сообщений: 10

Создать абстрактный класс

27.05.2019, 16:32. Показов 16158. Ответов 11

Студворк — интернет-сервис помощи студентам
Создать абстрактный класс Figure с методами вычисления площади и периметра, а также методом, который выводит информацию о фигуре на экран. Создать производные классы: Rectangle (прямоугольник), Circle (круг), Triangle (треугольник) со своими методами вычисления площади и периметра. Создать массив n фигур и вывести полную информацию о фигурах на экран.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.05.2019, 16:32
Ответы с готовыми решениями:

Создать абстрактный класс
Создать абстрактный класс Point (точка). На его основе создать классы ColoredPoint и Line. На основе класса Line создать класс ColoredLine...

Создать абстрактный класс «Издание»
Создать абстрактный класс «Издание» с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать абстрактный класс CVehicle. На его основе реализовать классы СРТапе, ССаг и CShip
Создать абстрактный класс CVehicle. На его основе реализовать классы СРТапе, ССаг и CShip. Классы должны иметь возможность задавать и...

11
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.05.2019, 09:57
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Figure():
    def __init__(self, perimeter=None, space=None):
        self.perimeter = perimeter
        self.space = space
        self.infoFig = []
    def calcPerimeter(self):
        pass
    def calcSpace(srlf):
        pass
    def figInfo(self):
        p = self.calcPerimeter()
        s = self.calcSpace()
        print('периметр = %s площадь = %s' %(p, s))
 
class Rectangle(Figure):
    def __init__(self, x, y, w, h):
        Figure.__init__(self)
        self.x = x
        self.y = y
        self.w = w
        self.h = h
    def calcPerimeter(self):
        perimeter = self.w * 2 + self.h * 2
        return perimeter
    def calcSpace(self):
        space = self.x * self.y
        return space
    def figInfo(self):
        p = self.calcPerimeter()
        s = self.calcSpace()
        print('У прямоугольника периметр = %s площадь = %s' %(p, s))
 
if __name__ == '__main__':
    fig1 = Rectangle(5, 5, 10, 10)
    fig2 = Rectangle(-3, -4, 5, 7)
    array = [fig1, fig2]
    for f in array:
        f.figInfo()
Zen26, Для круга и треугольника попробуйте сами написать по аналогии с прямоугольником.

Добавлено через 13 минут
Zen26, Что касается методов расчета периметра и площади для произвольной фигуры (например для нарисованного контура зайчика), я не знаю как считать, даже для интеграла нужна функция описывающая контур фигуры. Если найдете алгоритм вычисления периметра и площади для произвольной фигуры, то расчет можно будет вставить в методы вместо "pass".
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
28.05.2019, 09:58
Используйте
Python
1
from abc import ABC, abstractmethod
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.05.2019, 10:08
ioprst, Я этот метод не знаю, а мне уже пора уходить. Пусть сам попробует использовать этот метод или Вы если есть время помогите ему с этим методом.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.05.2019, 13:20
Python
1
2
3
4
5
6
class Figure:
    def calcPerimeter(self):
        raise NotImplemented
 
    def calcSpace(self):
        raise NotImplemented
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.05.2019, 15:24
Рыжий Лис, Возбуждая вручную исключение, Вы же не вычисляете периметр или, площадь. Хотя такой подход позволяет перехватывать эти методы , если они не перехвачены подклассами, и выполнять какие то действия, хотя я не представляю какие. Если же только для выдачи сообщений пользователям, то эти сообщения можно просто выводить в этих методах и без использования запрограммированных исключений. Мне так кажется, или я просто Вас не понял.

Добавлено через 4 минуты
Хотя с другой стороны, то, что предлагаете Вы, делает код более понятным и более логически органичным.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.05.2019, 15:27
Так методы "абстрактные" и их нужно переопределить в дочерних классах.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.05.2019, 15:41
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Так методы "абстрактные" и их нужно переопределить в дочерних классах.
Так я их и переопределяю. Поэтому программа нормально все отрабатывает. А вот если в подклассе не будут переопределены эти методы, то у меня они просто ничего не сделают, а у Вас они вызовут исключение.

Добавлено через 3 минуты
Я что то подзабыл. Или у Вас это делегирование, и у Вас если этих методов не будет в подклассе, то тоже ничего не произойдет? Лень сейчас лезть в учебник и вспоминать.

Добавлено через 7 минут
Вообще немного глупое задание, вычислять то, чего нельзя вычислить. Хотя вот ioprst, что то предложил, что как бы можно вычислить каким то общим методом для любой фигуры. Хотя интуитивно мне кажется это не возможно Если подходить формально, то в условии не говорится, что периметр должен быть непрерывной линией. А среди любых фигур могут быть и дискретные, с разбросанными частями. И как тогда вычислять, понятия не имею.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
28.05.2019, 18:15
Viktorrus, идея Рыжего Лиса в том, что если не переопределить методы в потомках, будет возникать исключение, что логично, т.к. абстрактные методы обязаны быть переопределены (из ООП). Просто решение задачи без дополнительных модулей.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.05.2019, 01:13
ioprst, Так я про то и написал, что он программно вызывает исключение. Но при правильно написанных подклассах эти методы не запустятся, а во вторых можно просто в этих методах печатать сообщение об ошибке, поясняющее в чем дело. И программное создание исключения в данном случае ничего особенно не дает. Но если так нравится исключение, то можно и с исключением.

Добавлено через 36 минут
Zen26, Извините. я не сразу врубился, что это задание на создание абстрактных классов. Поэтому предложение Рыжий Лис, уместно. Напишите эти методы как предлагает он.

Добавлено через 5 минут
Вот информация об абстрактных классах у Лутц М. Изучаем Python (4-е издание, 2011) стр. 778-781.
"Абстрактные суперклассы – классы, которые предполагают, что часть их функциональности будет реализована их подклассами.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Super:
    def method(self):
        print('in Super.method')     # Поведение по умолчанию
    def delegate(self):
        self.action()                           # Ожидаемый метод
 
class Provider(Super):                       # Определяет необходимый метод
    def action(self):
        print('in Provider.action')
 
if __name__ == '__main__':
    print('\nProvider…')
    x = Provider()
    x.delegate()
Provider Реализует метод action, который ожидается методом delegate класса Super.

Обратите внимание, как работает класс Provider в предыдущем примере. Когда через экземпляр класса Provider вызывается метод delegate, инициируются две независимые процедуры поиска:

1. При вызове x.delegate интерпретатор отыскивает метод delegate в классе Super, начиная поиск от экземпляра класса Provider и двигаясь вверх по дереву наследования. Экземпляр x передается методу в виде аргумента self, как обычно.

2. Внутри метода Super.delegate выражение self.action приводит к запуску нового, независимого поиска в дереве наследования, начиная от экземпляра self и дальше вверх по дереву. Поскольку аргумент self ссылается на экземпляр класса Provider, метод action будет найден в подклассе Provider.

Такой способ «восполнения пробелов» в реализации – обычное дело для платформ ООП. По крайней мере, в терминах метода delegate такие суперклассы, как в этом примере, иногда называют абстрактными суперклассами – классы, которые предполагают, что часть их функциональности будет реализована их подклассами. Если ожидаемый метод не определен в подклассе, интерпретатор возбудит исключение с сообщением о неопределенном имени, когда поиск в дереве наследования завершится неудачей. Разработчики классов иногда делают такие требования к подклассам более очевидными с помощью инструкций assert или возбуждая встроенное исключение NotImplementedError с помощью инструкции raise (более подробно об инструкциях, которые могут возбуждать исключения, мы поговорим в следующей части книги). Ниже приводится короткий пример приема, основанного на применении инструкции assert:
Python
1
2
3
4
5
6
7
8
9
class Super:
    def delegate(self):
        self.action()
    def action(self):
        assert False, 'action must be defined!'           # При вызове этой версии
 
>>> X = Super() 
>>> X.delegate() 
AssertionError: action must be defined!
Мы познакомимся с инструкцией assert в главах 32 и 33, а пока лишь замечу, что если выражение возвращает ложь, она возбуждает исключение с указанным сообщением об ошибке. В данном случае выражение всегда возвращает ложь, чтобы вызвать появление об ошибке, если метод не будет переопределен и поиск по дереву наследования остановится на этой версии. В некоторых классах, напротив, в таких методах-заглушках исключение NotImplementedError возбуждается напрямую.

Добавлено через 2 минуты
Python
1
2
3
4
5
6
7
8
9
class Super:
    def delegate(self):
        self.action()
    def action(self):
        raise NotImplementedError('action must be defined!')
 
>>> X = Super() 
>>> X.delegate() 
NotImplementedError: action must be defined!
При работе с экземплярами подклассов мы так же будем получать исключения, если эти подклассы не обеспечат собственную реализацию ожидаемого метода, замещающего метод в суперклассе:
Python
1
2
3
4
5
6
7
8
9
10
11
>>> class Sub(Super): pass 
... 
>>> X = Sub() 
>>> X.delegate()
NotImplementedError: action must be defined! 
>>> class Sub(Super): 
...     def action(self): print('spam') 
... 
>>> X = Sub() 
>>> X.delegate() 
spam
И так далее...
Если что, то читайте Лутца.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.05.2019, 13:54
Zen26, Понятие абстрактных суперклассов достаточно сложное. Извините, я не сразу сообразил, что здесь требуется.
Из Лутца:
" Способ определения абстрактного суперкласса зависит от версии интерпретатора. В Python 3.0 для этих целей используется именованный аргумент в заголовке инструкции class и специальный декоратор @abstract методов. Обе конструкции мы будем подробно рассматривать далее, в этой книге:
Python
1
2
3
4
5
6
from abc import ABCMeta, abstractmethod
 
class Super(metaclass=ABCMeta):
    @abstractmethod
    def method(self, ...):
        pass
Этот материал находится в последних двух главах книги Лутц М. Изучаем Python (4-е издание, 2011)
в главе 38 "Декораторы" и в главе 39 "Метаклассы"
Я их еще не изучал.
Поэтому еще раз извините, что сразу не разобрался и запудрил Вам мозги.
Может кто-то, кто разбирается с абстрактными суперклассами, поможет Вам.

Добавлено через 5 минут
Цитата Сообщение от ioprst Посмотреть сообщение
Используйте
Python
1
from abc import ABC, abstractmethod
Похоже ioprst, разбирается с абстрактными суперклассами. Может он Вам поможет.

Добавлено через 11 минут
Рыжий Лис, Я Вас тоже не сразу понял, извините.
0
0 / 0 / 0
Регистрация: 27.05.2019
Сообщений: 122
29.05.2019, 18:56
Тупое название "абстрактный класс", как будто бы класс может быть не абстрактным.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.05.2019, 18:56
Помогаю со студенческими работами здесь

Абстрактный класс
Разбираю пример с книги укус питона. Есть абстрактный класс для создания 2х других не абстрактных классов. from abc import * ...

Создать абстрактный класс Издание с виртуальными методами
Создать абстрактный класс Издание с виртуальными методами позволяющим вывести на экран информацию об издании, а также определить является...

Создать абстрактный класс Triad (тройка) и производные классы Date (дата) и Time (время). Создать класс Memories
Создать абстрактный класс Triad (тройка) с виртуальными методами увеличения на 1. На его основе реализовать классы Date (дата) и Time...

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

Создать абстрактный класс «Товар», на его основе создать класс «Автомобиль»
Вечер добрый, а может и не добрый. В изучении C# столкнулся с такой проблемой - как исключения. Имею такую задачу. Создать абстрактный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru