Уведомления

Группа в Telegram: @pythonsu

#1 Июль 22, 2018 17:12:50

Levitanus
Зарегистрирован: 2018-05-01
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

super().method и return

Еще один нубский вопрос, за который, видимо, опять по шапке получу
есть базовый класс с такими методами:

 @abstractmethod
def generate_init(self):
    if not self.__has_init:
        return
    return True
@staticmethod
def generate_all_inits():
    out = list()
    for inst in KspObject.__instances:
        inst_init = inst.generate_init()
        if inst_init is None:
            continue
        if not isinstance(inst_init, list):
            raise TypeError('list expected')
        out.extend(inst_init)
    return out
как сделать так, чтобы в потомках не приходилось делать так:
 def generate_init(self):
    if super().generate_init():
        return [f'{self.name()} init']

Отредактировано Levitanus (Июль 22, 2018 17:22:07)

Офлайн

#2 Июль 22, 2018 21:56:45

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

super().method и return

Levitanus
как сделать так, чтобы в потомках не приходилось делать так:
я боюсь спросить накой ляд вы так делаете?
декоратор @abstractmethod кагбэ говорит что в дочернем классе вы должны его переопределить, накой вы его вызываете?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Июль 22, 2018 22:06:00

Levitanus
Зарегистрирован: 2018-05-01
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

super().method и return

PEHDOM
декоратор @abstractmethod кагбэ говорит что в дочернем классе вы должны его переопределить, накой вы его вызываете?
эмм… Ну я смотрю в докстринг abstractmethod и вижу, ‘can be instantiated via super()’, видимо, неспроста.
Вообще конкретный кейс я уже переделал на:
 @abstractmethod
def generate_init(self):
    pass
@abstractmethod
def generate_executable(self):
    pass
@staticmethod
def generate_all_inits():
    out = list()
    for inst in KspObject.__instances:
        if not inst.__has_init:
            continue
        inst_init = inst.generate_init()
        if inst_init is None:
            continue
        if isinstance(inst_init, str):
            raise TypeError('can not add string')
        out.extend(inst_init)
    return out
Но суть вопроса остается прежней. Как решается выход из функции посредством return в методе, если метод вдруг вызывается как супер? Или не решается никак, и просто супер реализует свой функционал, а селф свой, никак не связанный с тем, что там выкинет супер?

Офлайн

#4 Июль 23, 2018 00:42:51

Levitanus
Зарегистрирован: 2018-05-01
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

super().method и return

а, я знаю, почему я использую супер. И в этом гораздо больше смысла

Это способ утиной проверки аргументов.
Потому что если вызывать супер абстрактного метода, он агрантированно запросит положенные в него аргументы, во)

Офлайн

#5 Июль 23, 2018 10:29:53

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

super().method и return

Levitanus
Как решается выход из функции посредством return в методе, если метод вдруг вызывается как супер? Или не решается никак, и просто супер реализует свой функционал, а селф свой, никак не связанный с тем, что там выкинет супер?
в смысле как рещаеться? обыкновенно, и все там связано, вы вызываете метод родительского класса, но подаете ему первым аргументом инстанс дочернего, оно делает все что нужно с дочерним инстансом, и возвращает опять же то что заложено логикой. super() предназначен для вызова методов родительского класса из дочернего, на случай если вы переопределили метод.
В простых случаях, для лучшего понимания super().method(*args, **kwargs) аналогичен ParentClass.method(self, *args, **kwargs)
В сложных же , например множественное наследование, могут быть проблемы с разрешением наследования, при использовании ParentClass.method(self, *args, **kwargs), так что лучше все же использовать super().



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 23, 2018 10:31:11)

Офлайн

#6 Июль 25, 2018 20:37:30

Levitanus
Зарегистрирован: 2018-05-01
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

super().method и return

Прошу прощения, был в поезде.
Ну в принципе это-то понятно. Но мне интересен был контекст родительского метода в рамках большой кодовой базы, или библиотеки, в которой ты уже понятия не имеешь, что происходит во всех родительских вызовах. В общем случае, я так понимаю, для кода метода класса не должно быть разницы, есть в нем вызов суперметода или нет. Но вот допустимо ли принудительно прерывать метод в некоторых случаях, если да то как кошернее? Исключением? А если оно всплывает через год?) наверное-таки нет.

Офлайн

#7 Июль 25, 2018 22:30:28

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

super().method и return

Levitanus
Но мне интересен был контекст родительского метода в рамках большой кодовой базы, или библиотеки, в которой ты уже понятия не имеешь, что происходит во всех родительских вызовах.
размер кодовой базы не имеет значения, super() вызывает метод(ы) только своего непосредственного родителя(ей) а не всю цепочку, Метод родителя может в свою очередь вызывать метод своего родителя, а может и не вызывать.

Levitanus
Но вот допустимо ли принудительно прерывать метод в некоторых случаях, если да то как кошернее?
Не совсем понятно что значит “принудительно прерывать метод”?Но в общем это зависит от вашеих целей, и того что делает метод который “прерывают”. Вы должны понимать чем чревато “прерывание”, и на месте решить что для этого нужно, кинуть исключение или просто вернуть None, например.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 25, 2018 22:34:12)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version