Форум сайта python.su
class A: def __new__(cls, *args): if (len(args) == 0): return super(A, cls).__new__(cls) if int(args[0]) < 5: return super(A, cls).__new__(cls) else: return 0 def __init__(self, n): n = n + 1 print('a ' + str(n)) B(n) class B(A): def __new__(cls, *args): return super(B, cls).__new__(cls) def __init__(self, n): n = n + 1 print('b ' + str(n)) try: # Почему если раскомментировать строку ниже код выполняется - b 6 #A(n) # А если раскомментировать строку ниже то ошибка ? - b 664error #super().__init__(n) except: print('error') a = A(0)
Офлайн
KULINAR847а какой результат вы ожидаете? у вас тут бесконечная рекурсия , рано или поздно вы получите maximum recursion depth exceeded.
# А если раскомментировать строку ниже то ошибка ? - b 664error #super().__init__(n)
return super(B, cls).__new__(cls)
if (len(args) == 0): return super(A, cls).__new__(cls)
if int(args[0]) < 5: return super(A, cls).__new__(cls) else: return 0
return super(B, cls).__new__(cls, *args)
[code python][/code]
Отредактировано PEHDOM (Сен. 20, 2019 15:34:32)
Офлайн
PEHDOM
Уважаемый PEHDOM благодарю за объяснение. Теперь я понял, что даже если заменитьнаsuper().__init__(n)результат будет тот же. Хотелось завершить как-нибудь рекурсию через super()A.__init__(self,n)
Отредактировано KULINAR847 (Сен. 20, 2019 15:52:14)
Офлайн
KULINAR847нужно менять логику или в А.__new__ или в B.__new__ (выше я уже писал как), или в А.__init__ ставить доп проверку типа
Хотелось завершить как-нибудь рекурсию через super()
if n < 5: B(n)
if n <5: super().__init__(n)
[code python][/code]
Отредактировано PEHDOM (Сен. 20, 2019 16:06:48)
Офлайн
PEHDOM
Точно
Офлайн
поправте если ошибаюсь super().__init__(n) в классе В дергает только метод из класа А без создания энкземпляра класса А
Офлайн
AD0DE412естественно, super().__init__(n) в данном конкретном сдучае можно записать как A.__init__(self, n). оно просто выполняет метод класса А над инстансом дочернего класса В. экземпляр класса А не создаеться при этом.
super().__init__(n) в классе В дергает только метод из класа А без создания энкземпляра класса А
[code python][/code]
Отредактировано PEHDOM (Сен. 20, 2019 22:23:09)
Офлайн