ООП. Порядок разрешения методов
В лекции «ООП. Разрешение имен атрибтутов» мы упомянули о том, что поиск атрибутов осуществляется сначала в словаре класса, а затем в родительских классах в соответствии с MRO (Method Resolution Order).
def mro(cls):
return [cls] + merge(list(map(mro, cls.__bases__)) + [list(cls.__bases__)])
def merge(seqs):
if not seqs:
return []
if len(seqs) == 1:
return seqs[0]
res = []
while seqs:
for seq in seqs:
head = seq[0]
if not any(head in tail for _, *tail in seqs):
break
else:
raise TypeError("Inconsistent hierarchy")
res.append(head)
for seq in seqs:
if seq[0] == head:
del seq[0]
seqs = [s for s in seqs if s]
return res
Последнее обновление: 25 июня 2020 г.