Единственный способ, которым я знаю обследовать клиента, - это коллекция ServerVariables объекта Request (должна быть доступна для кода MVC).
См. http: //www.4guysfromrolla. com / webtech / 092298-3.shtml для получения дополнительной информации. REMOTE_HOST и REMOTE_ADDR выглядят как кандидаты.
Из в блоге 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)
Метод super()
просто находит следующий метод для вызова на основе MRO.
D.go()
вызывает B.go()
, который затем вызывает C.go()
, который печатает C
и возвращается к B.go()
, который печатает B
и, наконец, возвращается к D.go()
, который печатает D
Если вы ожидаете, что все методы go()
будут вызываться, вы должны раскомментировать вызов super()
в C.go()
.
Вы можете найти намного больше информация о вызовах MRO и super()
из собственного блога Guido
B
не вызывает своиsuper()
иC
, вызывает егоsuper()
, почему результат «B\n D\n»? почемуC.go()
никогда не печатает? – Meng Jie 13 July 2018 в 21:32super()
, разрешение закончено, и вы можете прекратить поиск других методов. Я мог ошибаться, хотя ... – Engineero 13 July 2018 в 22:56