Всем привет!
Прохожу курс по python на stepik.org. Задачка по наследованию классов.
Суть: даются дети и их предки (класс и классы от которых идет наследование). Потом даются пары предок и потомок, например A B. Нужно ответить является ли А предком для B.
Вводные задачи:
4 #сколько будет передано строк говорящих кто от кого наследует
A #не наследует
B : A #В наследует от А
C : A
D : B C
1 #сколько будет передано пар для проверки
C D #является ли С предком D?
теперь то что я навоял:
def test_parent(par,ch): #функция получающая предка и потомка для. Возвращает является ли предок потомку предком))
# par - parent and ch - childe
global dict_of_class
if dict_of_class.get(ch) != 'None':
for i in range(len(dict_of_class.get(ch))):
print("-- "+dict_of_class.get(ch)[i])
if dict_of_class.get(ch)[i] == par:
return print('answer Yes')
elif dict_of_class.get(dict_of_class.get(ch)[i]) == 'None':
print('!!1!!')
else:
return test_parent(par,dict_of_class.get(ch)[i])
dict_of_class = {}
r1 = input()
for i in range(int(r1)):
tmp = input().split()
if len(tmp) >1:
dict_of_class.update({tmp[0] : tmp[tmp.index(':')+1:]})
else:
dict_of_class.update({tmp[0] : 'None'})
r2 = input()
for i in range(int(r2)):
tmp = input().split()
print('')
print('')
print("childe " + tmp[1] + " :")
if dict_of_class.get(tmp[1]) == 'None':
if tmp[0] == tmp[1]:
print('answer Yes')
else:
print('answer No')
else:
test_parent(tmp[0],tmp[1])
Получаю следующее:
childe D :
-- B
-- A
по идее, для потомка D, должен быть следующий проход: B,A,C
Если я правильно понял, mro() работает так:
classD(B, C):
pass
Сначала он смотрит на B, потом на предков В, потом на С, потом на предков С.
Теперь вопрос:
Функция когда доходит до последнего предка В (это А) и видит что А не имеет предков, прерывает свое выполнение. Но по идее она должна прерывать себя и возвращаться к перебору предков D, то есть после места print('!!1!!'), функция должна прерваться и вернуться по рекурсии в саму себя же.
Почему?
PS спасибо всем кто дочитал))