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

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

06.04.2020, 20:27. Показов 2647. Ответов 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
 Аватар для Рыжий Лис
5973 / 3735 / 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
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2020, 11:40  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Извини, не понял вопроса.
Допустим мы в базовом классе вдруг решили переименовать метод базового класса test на test2 (и забыли это сделать в наследниках) при отсутствии override мы не получим никаких (вменяемых)ошибок в наследнике. Так же если мы пишем наследник и в имени метода допускаем опечатку тоже не получим никаких (вменяемых)ошибок.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.04.2020, 11:47
Ну не знаю, так себе аргумент. IDE поддерживают рефакторинг кода, на скриншоте ниже будут переименованы все методы в дочерних классах и вызовы этих методов.
Миниатюры
Есть ли в Python3 нечто вроде override в других языках?  
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 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
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2020, 12:10  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
IDE поддерживают рефакторинг кода,
А если писать в блокноте?

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

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

А методы с одинаковыми именами в питоне допустимы.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2020, 12:13  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Можно взять библиотеку overrides или подправить мой велосипед.
Где ее взять?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 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
8488 / 6155 / 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru