Почему базовый класс не работает в этом множественном наследовании?

Единственный способ, которым я знаю обследовать клиента, - это коллекция ServerVariables объекта Request (должна быть доступна для кода MVC).

См. http: //www.4guysfromrolla. com / webtech / 092298-3.shtml для получения дополнительной информации. REMOTE_HOST и REMOTE_ADDR выглядят как кандидаты.

1
задан Meng Jie 13 July 2018 в 13:44
поделиться

2 ответа

Из в блоге Guido :

Вычисление MRO было официально задокументировано как использование пройденного по глубине первого слева направо классов, как и раньше. Если какой-либо класс был дублирован в этом поиске, все, кроме последнего вхождения, будут удалены из списка MRO.

Итак, если у вас есть, например:

class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass

Вместо простого порядка разрешения глубины в D, B, A, C, A, MRO удаляет все, кроме последнего экземпляра повторяющегося элемента, поэтому у вас есть D, B, C, A. В вашем случае ваш класс C не называет его super() (поскольку вы его прокомментировали). Таким образом, если я не ошибаюсь, MRO отзывает вызов до A до C, но поскольку C не вызывает его super(), вы никогда не увидите A.go():

D.go() --> B.go() (--> A.go() removed by MRO) --> C.go() (x> A.go() not called)
]
0
ответ дан Engineero 17 August 2018 в 12:42
поделиться
  • 1
    Спасибо вашему ответу, теперь я понимаю. Но, если B не вызывает свои super() и C, вызывает его super(), почему результат «B\n D\n»? почему C.go() никогда не печатает? – Meng Jie 13 July 2018 в 21:32
  • 2
    Я считаю, что, когда вы достигнете всего, что не вызывает его super(), разрешение закончено, и вы можете прекратить поиск других методов. Я мог ошибаться, хотя ... – Engineero 13 July 2018 в 22:56
  • 3
    Думаю, и так. Но не смог найти официального объяснения. Спасибо! – Meng Jie 14 July 2018 в 00:45

Метод super() просто находит следующий метод для вызова на основе MRO.

D.go() вызывает B.go(), который затем вызывает C.go(), который печатает C и возвращается к B.go(), который печатает B и, наконец, возвращается к D.go(), который печатает D

Если вы ожидаете, что все методы go() будут вызываться, вы должны раскомментировать вызов super() в C.go().

Вы можете найти намного больше информация о вызовах MRO и super() из собственного блога Guido

1
ответ дан Sunitha 17 August 2018 в 12:42
поделиться
  • 1
    Благодарю. Я читаю блог, который вы упомянули, но все еще немного смущенный некоторыми сценариями – Meng Jie 13 July 2018 в 21:36
Другие вопросы по тегам:

Похожие вопросы: