Найти - Пользователи
Полная версия: super().method и return
Начало » Python для новичков » super().method и return
1
Levitanus
Еще один нубский вопрос, за который, видимо, опять по шапке получу
есть базовый класс с такими методами:
 @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']
PEHDOM
Levitanus
как сделать так, чтобы в потомках не приходилось делать так:
я боюсь спросить накой ляд вы так делаете?
декоратор @abstractmethod кагбэ говорит что в дочернем классе вы должны его переопределить, накой вы его вызываете?
Levitanus
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 в методе, если метод вдруг вызывается как супер? Или не решается никак, и просто супер реализует свой функционал, а селф свой, никак не связанный с тем, что там выкинет супер?
Levitanus
а, я знаю, почему я использую супер. И в этом гораздо больше смысла

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

Levitanus
Но вот допустимо ли принудительно прерывать метод в некоторых случаях, если да то как кошернее?
Не совсем понятно что значит “принудительно прерывать метод”?Но в общем это зависит от вашеих целей, и того что делает метод который “прерывают”. Вы должны понимать чем чревато “прерывание”, и на месте решить что для этого нужно, кинуть исключение или просто вернуть None, например.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB