Я хотел бы добавить к , что @Visionscaper говорит вверху:
Third --> First --> object --> Second --> object
В этом случае интерпретатор не отфильтровывает класс объекта, потому что его дублированный, скорее потому что второй появляется в позиции головы и не появляется в позиции хвоста в подмножестве иерархии. Хотя объект появляется только в хвостовых позициях и не считается сильной позицией в алгоритме C3 для определения приоритета.
Линеаризация (mro) класса C, L (C), является
Линеаризированное слияние выполняется путем выбора общих классов, которые отображаются в виде главы списков, а не хвоста, начиная с вопросов порядка (станет ясно ниже)
линеаризация третьего может быть вычислена следующим образом:
L(O) := [O] // the linearization(mro) of O(object), because O has no parents
L(First) := [First] + merge(L(O), [O])
= [First] + merge([O], [O])
= [First, O]
// Similarly,
L(Second) := [Second, O]
L(Third) := [Third] + merge(L(First), L(Second), [First, Second])
= [Third] + merge([First, O], [Second, O], [First, Second])
// class First is a good candidate for the first merge step, because it only appears as the head of the first and last lists
// class O is not a good candidate for the next merge step, because it also appears in the tails of list 1 and 2,
= [Third, First] + merge([O], [Second, O], [Second])
// class Second is a good candidate for the second merge step, because it appears as the head of the list 2 and 3
= [Third, First, Second] + merge([O], [O])
= [Third, First, Second, O]
Таким образом, для реализации super () в следующем коде:
class First(object):
def __init__(self):
super(First, self).__init__()
print "first"
class Second(object):
def __init__(self):
super(Second, self).__init__()
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__()
print "that's it"
становится очевидным, как этот метод будет разрешен
Third.__init__() ---> First.__init__() ---> Second.__init__() --->
Object.__init__() ---> returns ---> Second.__init__() -
prints "second" - returns ---> First.__init__() -
prints "first" - returns ---> Third.__init__() - prints "that's it"
да, вы можете добиться этого, назначив идентификатор экрана перед вызовом объекта helproute. Если вы хотите, чтобы screen_id был динамическим, вам необходимо сначала передать значение объекту. См. Пример,
let helpRoutes = {};
for(let screen_id=0;screen_id<10;screen_id++){
helpRoutes[`wizard/${screen_id}/step1`] =`This is help content for step ${screen_id}`;
}
[ 113] После присвоения значения Helproutes вы можете получить значение.
helpRoutes['wizard/2/step1']
Вместо
let helpRoutes = {
'wizard/{screen_id}/step1': 'This is help content for step 1',
'wizard/{screen_id}/step2': 'This is help content for step 2'
}
вы можете написать его как
let helpRoutes = {
'step1': 'This is help content for step 1',
'step2': 'This is help content for step 2'
}
Извлечь последнее слово, используя разделитель / , и получить данные из json. Например, если маршрут wizard/1234/step1
, получите последнее слово step1
, а затем help[step1]
.
Это может быть один подход.