Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

Есть ли в Python3 нечто вроде override в других языках?

06.04.2020, 20:27. Показов 2595. Ответов 9

Студворк — интернет-сервис помощи студентам
Есть ли в Python3 нечто вроде:

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
import functools
import inspect
 
class OverrideException(Exception):
   pass
 
def override(method):
   def wrapper(self,*args,**kwargs):    
      base = inspect.getmro(type(self))[1]           
      if not hasattr(base, method.__name__):
        raise OverrideException('Base class "{0}" do not have method "{1}"'.format(base.__name__,method.__name__))
      return method(self,*args,**kwargs) 
   return wrapper  
 
 
class Base:
    def __init__(self):
       pass
       
    # virtual 
    def test(self):
       print("Base.test()")    
     
     
class Derived(Base):
    def __init__(self):
       super().__init__()
       
    @override 
    def test(self):
       print("Derived.test()")    
     
    @override 
    def test2(self):
       print("Derived.test2()")    
 
     
def main():  
     d = Derived()
     d.test()
     d.test2()
    
        
if __name__=='__main__':
  try:
     main()
  except Exception as e:   
     print(e)
Может есть что-то из библиотек вместо этого велосипеда.

https://ideone.com/Y3cs6D
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2020, 20:27
Ответы с готовыми решениями:

Есть ли Microsoft Visual C++ 2015 нечто вроде как у С++ - перетаскивание элементов на форму окна?
Есть ли Microsoft Visual C++ 2015 нечто вроде как у С++ - перетаскивание элементов на форму окна?

Есть ли в других языках аналоги canvas из lazarus ?
Есть ли в других языках аналоги canvas из lazarus ? в лазарусе очень удобно рисовать, а вот pascal не очень удобен. Может есть какая...

Каких команд нет в Bash и CMD и в то же время которые есть в других языках программирования (и наоборот)
Интересно, чего нет для программирования в консоли и BAT файлов и в то же время присутствует в распространенных языках программирования? ...

9
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.04.2020, 09:35
Извини, не понял вопроса.

Переопределять методы родительского класса можно:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Base:
    # abstract
    def test(self):
        raise NotImplementedError
 
 
class Derived(Base):
    # override
    def test(self):
        print("Derived.test()")
 
    def test2(self):
        print("Derived.test2()")
 
 
def main():
    d = Derived()
    d.test()
    d.test2()
 
 
if __name__ == '__main__':
    main()


Или ты хочешь запретить добавлять новые методы у дочерних классов? Для переменных/полей это возможно:
Python
1
2
3
4
5
6
7
8
9
class Base:
    __slots__ = 'a', 'b'
 
    def __init__(self, a, b):
        self.a = a
        self.b = b
 
obj = Base(1, 2)
obj.new_var = 42  # AttributeError: 'Base' object has no attribute 'new_var'
Для сравнения закомментируй строку __slots__.

Может тебя заинтересует это:
Python
1
2
3
4
5
6
7
8
9
10
from dataclasses import dataclass
 
@dataclass(frozen=True)
class Base:
    name: str
    unit_price: float
    quantity_on_hand: int = 0
 
    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand
А так есть какая-то сторонняя либа: https://pypi.org/project/overrides/

Добавлено через 19 минут
Написал свой костыль. Правильность проверяется один раз, а не при каждом вызове метода:
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
import warnings
 
 
def overrideclass(cls):
    for method_name in dir(cls):
        if method_name.startswith('__'):
            continue
        method = getattr(cls, method_name)
        # если стоит декоратор @override
        if hasattr(method, '__is_override'):
            if not hasattr(cls.__base__, method_name):
                msg = 'Base class "{}" do not have method "{}"'.format(cls.__base__.__name__, method_name)
                warnings.warn(msg, DeprecationWarning, stacklevel=2)
    return cls
 
 
def override(method):
    setattr(method, '__is_override', True)
    return method
 
 
class Base:
    def test(self):
        raise NotImplementedError
 
 
@overrideclass
class Derived(Base):
    @override
    def test(self):
        print("Derived.test()")
 
    @override
    def test2(self):
        print("Derived.test2()")
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2020, 11:40  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Извини, не понял вопроса.
Допустим мы в базовом классе вдруг решили переименовать метод базового класса test на test2 (и забыли это сделать в наследниках) при отсутствии override мы не получим никаких (вменяемых)ошибок в наследнике. Так же если мы пишем наследник и в имени метода допускаем опечатку тоже не получим никаких (вменяемых)ошибок.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.04.2020, 11:47
Ну не знаю, так себе аргумент. IDE поддерживают рефакторинг кода, на скриншоте ниже будут переименованы все методы в дочерних классах и вызовы этих методов.
Миниатюры
Есть ли в Python3 нечто вроде override в других языках?  
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.04.2020, 11:53
Правда, теперь получим другую ошибку из-за декораторов:
Python
1
2
3
4
5
6
7
8
class Derived(Base):
    @override
    def test2(self):
        print("Derived.test()")
 
    @override
    def test2(self):
        print("Derived.test2()")
Но pylint отлавливает такую ошибку: method already defined line 48 (52:4) [function-redefined]

Если декораторы убрать, то IDE ругается нереопределение метода.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2020, 12:10  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
IDE поддерживают рефакторинг кода,
А если писать в блокноте?

Добавлено через 2 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Правда, теперь получим другую ошибку из-за декораторов:
Ну в примере test2() написан чисто для проверки что отрабатывает и выдает ошибку что мол метода нет для переопределения. Очевидно что одинаковых методов в одном классе не должно быть.

Добавлено через 8 минут
Я вспомнил что есть библиотек abc для поддержки интерфейсов, но она не дает такой наглядности в коде наследника.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.04.2020, 12:12
Я же не настаиваю Можно взять библиотеку overrides или подправить мой велосипед.

А методы с одинаковыми именами в питоне допустимы.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2020, 12:13  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Можно взять библиотеку overrides или подправить мой велосипед.
Где ее взять?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.04.2020, 12:30
Лучший ответ Сообщение было отмечено Avazart как решение

Решение

Bash
1
pip install overrides
Или скачать руками: https://github.com/mkorpela/overrides/releases
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2020, 12:42  [ТС]
Я про это и спрашивал. Но нужно еще будет пощупать эту либу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2020, 12:42
Помогаю со студенческими работами здесь

В терминале есть установленная версия Python3 а в списке приложений Python3 нет на Debian
Как сделать так что б в списке приложений то же был Python3 на Debian

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

Чат типа client_client нечто вроде LANTalk.
Люди... А как насчет чата типа client_client нечто вроде LANTalk?

Нужно нечто вроде сверх-примитивной СУБД
Допустим, некая девушка завела кучу знакомств по интернету. Надо вести учёт потенциальных женихов - фотка и краткие заметки (один богатый,...

(offtop) Существует ли для VB нечто вроде Visual Assist... (+)
.... Существует ли для VB нечто вроде Visual Assist. Это программ позволяет круто подсвечивать текст и выводить оч. полезный контекстный...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru