Форум сайта python.su
0
Еще один нубский вопрос, за который, видимо, опять по шапке получу 
есть базовый класс с такими методами:
@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)
Офлайн
294
Levitanusя боюсь спросить накой ляд вы так делаете?
как сделать так, чтобы в потомках не приходилось делать так:
[code python][/code]
Офлайн
0
PEHDOMэмм… Ну я смотрю в докстринг abstractmethod и вижу, ‘can be instantiated via super()’, видимо, неспроста.
декоратор @abstractmethod кагбэ говорит что в дочернем классе вы должны его переопределить, накой вы его вызываете?
@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
Офлайн
0
а, я знаю, почему я использую супер. И в этом гораздо больше смысла 
Это способ утиной проверки аргументов.
Потому что если вызывать супер абстрактного метода, он агрантированно запросит положенные в него аргументы, во)
Офлайн
294
Levitanusв смысле как рещаеться? обыкновенно, и все там связано, вы вызываете метод родительского класса, но подаете ему первым аргументом инстанс дочернего, оно делает все что нужно с дочерним инстансом, и возвращает опять же то что заложено логикой. super() предназначен для вызова методов родительского класса из дочернего, на случай если вы переопределили метод.
Как решается выход из функции посредством return в методе, если метод вдруг вызывается как супер? Или не решается никак, и просто супер реализует свой функционал, а селф свой, никак не связанный с тем, что там выкинет супер?
[code python][/code]
Отредактировано PEHDOM (Июль 23, 2018 10:31:11)
Офлайн
0
Прошу прощения, был в поезде.
Ну в принципе это-то понятно. Но мне интересен был контекст родительского метода в рамках большой кодовой базы, или библиотеки, в которой ты уже понятия не имеешь, что происходит во всех родительских вызовах. В общем случае, я так понимаю, для кода метода класса не должно быть разницы, есть в нем вызов суперметода или нет. Но вот допустимо ли принудительно прерывать метод в некоторых случаях, если да то как кошернее? Исключением? А если оно всплывает через год?) наверное-таки нет.
Офлайн
294
Levitanusразмер кодовой базы не имеет значения, super() вызывает метод(ы) только своего непосредственного родителя(ей) а не всю цепочку, Метод родителя может в свою очередь вызывать метод своего родителя, а может и не вызывать.
Но мне интересен был контекст родительского метода в рамках большой кодовой базы, или библиотеки, в которой ты уже понятия не имеешь, что происходит во всех родительских вызовах.
LevitanusНе совсем понятно что значит “принудительно прерывать метод”?Но в общем это зависит от вашеих целей, и того что делает метод который “прерывают”. Вы должны понимать чем чревато “прерывание”, и на месте решить что для этого нужно, кинуть исключение или просто вернуть None, например.
Но вот допустимо ли принудительно прерывать метод в некоторых случаях, если да то как кошернее?
[code python][/code]
Отредактировано PEHDOM (Июль 25, 2018 22:34:12)
Офлайн