Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 1 / 1
Регистрация: 16.04.2020
Сообщений: 39

ООП Наследование

28.04.2020, 11:18. Показов 2876. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Не могу понять один момент с функцией Super().
Рассмотрим на простом примере.

Например у меня есть класс Guns и метод Fire.
Python
1
2
3
4
5
class Guns:
    strength = 100
    
    def fire():
        strength -= 10
Каждый раз при вызове Fire выносливость оружия становится меньше на 10.

Например я создаю новый класс АК, наследника Guns
Как мне взять функцию fire у родителя.
и сделать чтобы по мимом отнимания выносливости оружия,
добавлялся звук выстрела например "Пиу-Пиу-Пиу"
Это ведь делается с помощью функци super()?
Python
1
class AK(Guns):
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2020, 11:18
Ответы с готовыми решениями:

Наследование ООП
Реализуйте класс BellTower, моделирующий колокольню с маленькими колокольчиками LittleBell (которые при вызове метода sound печатают слово...

ООП, наследование, перегрузка методов
Создать класс квадрат, член класса — длина стороны. Предусмотреть в классе методы вычисления и вывода сведений о фигуре: периметр, площадь,...

Правильно ли идет у меня наследование по стандартам ООП?
Правильно ли идет у меня наследование по стандартам ООП? class человек: def __init__(self, имя, возраст, пол, урвоень_здоровья):...

14
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
28.04.2020, 11:40
в данном примере супер не актуален. что бы выводило что то вам нужно переопределить родительский метод или создать новый который уже использует родительский

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Guns:
    strength = 100
    
    def fire(self):
        Guns.strength -= 10
 
 
 
class AK(Guns):
    
    def akfire(self):
        self.fire()
        print("Пиу-Пиу-Пиу")
 
 
 
ak = AK()
ak.akfire()
print(Guns.strength)
print(AK.strength)
0
2 / 1 / 1
Регистрация: 16.04.2020
Сообщений: 39
28.04.2020, 11:49  [ТС]
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
в данном примере супер не актуален. что бы выводило что то вам нужно переопределить родительский метод или создать новый который уже использует родительский
Но, в таком случае приходится создавать новый метод akfire.
Более правильный подход (как мне кажется), который я хочу сделать.
Использовать уже имеющийся метод родителя fire
и добавить к нему вывод сообщения "Пиу-Пиу-Пиу" (переопределить).
Чтобы понять, как наследовать методы.
0
Заяц, просто Заяц.
 Аватар для Fury67
666 / 280 / 156
Регистрация: 12.11.2017
Сообщений: 882
28.04.2020, 11:55
Ты так хочешь что ли?
Python
1
2
3
4
class AK(Guns):
    def fire(self):
        super().fire()
        print("Пиу-Пиу-Пиу")
0
2 / 1 / 1
Регистрация: 16.04.2020
Сообщений: 39
28.04.2020, 11:58  [ТС]
Даа

но в таком случае при вызове метода выходит ошибка
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Guns:
    strength = 100
 
    def fire(self):
        Guns.strength -= 10
 
 
class AK(Guns):
 
    def fire(self):
        self.fire()
        print("Пиу-Пиу-Пиу")
 
 
ak = AK()
ak.fire()
File "D:/Python/123.py", line 11, in fire
self.fire()
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
0
Заяц, просто Заяц.
 Аватар для Fury67
666 / 280 / 156
Регистрация: 12.11.2017
Сообщений: 882
28.04.2020, 11:59
Лучший ответ Сообщение было отмечено Aidarchik как решение

Решение

У меня написано не так:
Цитата Сообщение от Aidarchik Посмотреть сообщение
self.fire()
А так:
Python
1
super().fire()
1
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
28.04.2020, 11:59
Aidarchik, мне кажется, что вы пытались получить что-то такое.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Guns:
    def __init__(self):
        self.strength = 100
 
    def fire(self):
        self.strength -= 10
 
 
class AK(Guns):
    def fire(self):
        super().fire()
        print("Пиу-Пиу-Пиу")
 
 
ak = AK()
print(ak.strength)
ak.fire()
print(ak.strength)
1
2 / 1 / 1
Регистрация: 16.04.2020
Сообщений: 39
28.04.2020, 12:39  [ТС]
Спасибо ребят, да именно так и хотел я.
С этим моментом я всё понял, и даже несколько вариантов увидел)

А если я сделаю class solder:
Как мне одеть АК на солдата?

Получается мне надо сперва создать солдата,
потом одеть на него АК.

Как то так?

Python
1
2
3
solder = Solder()
solder.weapon = AK()
soder.ak.fire
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
28.04.2020, 12:58
Лучший ответ Сообщение было отмечено Aidarchik как решение

Решение

Цитата Сообщение от Aidarchik Посмотреть сообщение
Как то так?
Нет немного не так.
Ваш вариант будет таким:
Python
1
2
3
4
5
6
7
8
solder = Solder()
solder.weapon = AK()
 
# Так писать неправильно
# solder.ak.fire
# Так как у объекта solder нет атрибута ak
# Правильно будет
solder.weapon.fire()

Если уж делать класс солдата, то делать это нормально. Нужно инкапсулировать процесс взятия оружия и выстрела.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Soldier:
    def __init__(self):
        self.weapon = None
 
    def get_weapon(self, new_weapon):
        self.weapon = new_weapon
 
    def fire(self):
        if self.weapon:
            self.weapon.fire()
 
soldier = Soldier()
soldier.get_weapon(AK())
soldier.fire()
1
2 / 1 / 1
Регистрация: 16.04.2020
Сообщений: 39
28.04.2020, 17:08  [ТС]
Не могу теперь вывести перемену родительского класса strength

не работает
Python
1
print(ak.strength)
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
28.04.2020, 17:09
Весь код покажите
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.04.2020, 17:34
Aidarchik, Вот пример из Лутца
Python
1
2
3
4
class Manager(Person):
    def giveRaise(self, percent, bonus=.10):
        Person.giveRaise(self, percent + bonus) # Правильно: дополняет  
                                                # оригинал
Если нет крайней необходимости, то лучше вместо super напрямую использовать имя родительского класса (супер класса).
При использовании super чаще возникают ошибки, с которыми приходится разбираться.
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
28.04.2020, 17:40
Viktorrus, На этапе обучения он должен научиться использовать данную функцию. А касательно того, где и когда стоит её применять, то это уже другая история.
0
2 / 1 / 1
Регистрация: 16.04.2020
Сообщений: 39
28.04.2020, 17:45  [ТС]
в последней строке ошибка
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Tools:
    def __init__(self):
        self.strength = 100
 
    def action(self):
        self.strength -= 10
 
 
class Saw(Tools):
    def action(self):
        super().action()
        print("БРБРБРБР")
 
 
class Axe(Tools):
    pass
 
 
class Drill(Tools):
    pass
 
 
class Hummer(Tools):
    pass
 
 
class Screwdriver(Tools):
    pass
 
 
class Robot:
    def __init__(self):
        self.tool = None
 
    def get_tool(self, new_tool):
        self.tool = new_tool
 
    def action(self):
        if self.tool:
            self.tool.action()
 
    def setup_tool(self):
        pass
 
    def drop_tool(self):
        pass
 
 
robot_1 = Robot()
robot_1.get_tool(Saw())
robot_1.action()
print(Tools.strength())
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
28.04.2020, 17:52
Aidarchik, Во первых, strength - это не метод, а атрибут, и это значит, что не нужно писать скобочки после него.
Во вторых, вы вызываете strength у класса Tools, а должны вызывать у инстанса этого класса.
В вашем случает нужно в классе Robot добавить метод получения этого параметра у оружия.
Python
1
2
3
    def get_strength(self):
        if self.weapon:
            return self.weapon.strength
Тогда последняя строка изменится на
Python
1
print(robot_1.get_strength())
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2020, 17:52
Помогаю со студенческими работами здесь

ООП. Перегрузка операторов в наследование с примесью полиморфизма
Здравствуйте, нужна помощь, а то мозг болит. В общем не получается получить сумму разных атрибутов из разных наследуемых классов, а...

Изучаю Python, сейчас учу основы ООП, где можно найти задачи по ООП
Скиньте пожалуйста источники с задачами(желательно на русском)

ООП наследование
Доброго времени суток. Подскажите, как значение переменной Var(то что лежит, в классе А), передать в другой класс? В этом случае в...

наследование в ооп
class worker { #name = "" #surname = "" #FullName = "" #rate = 0 #days = 0 ...

ООП. Наследование
Всем привет! Есть небольшая рабочая программа, которая добавляет в массив некоторое количество чисел, после каждого запуска уменьшает...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru