Я хотел немного уточнить ответ безжизненным , потому что, когда я начал читать о том, как использовать super () в иерархии множественного наследования в Python, я не получил его немедленно.
Что вам нужно понять, так это то, что super(MyClass, self).__init__()
предоставляет следующий метод next __init__
в соответствии с используемым алгоритмом упорядочивания разрешения метода (MRO) в контексте полного наследования иерархия .
Эта последняя часть имеет решающее значение для понимания. Рассмотрим снова пример:
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"
В соответствии с этой статьей о порядке разрешения метода Гвидо ван Россума вычисляется порядок разрешения __init__
(до Python 2.3) используя «перекос по левому краю по глубине»:
Third --> First --> object --> Second --> object
После удаления всех дубликатов, кроме последнего, получаем:
Third --> First --> Second --> object
Итак, позволяет следить за тем, что происходит, когда мы создаем экземпляр класса Third
, например x = Third()
.
__init__
третьего вызывается первым. __init__
super(Third,
self).__init__()
разрешается __init__
метод First, который вызывается. __init__
Первого super(First, self).__init__()
вызывает __init__
из Во-вторых, потому что это то, что диктует MRO! __init__
of Second super(Second, self).__init__()
вызывает __init__
объекта, что ничего не значит. После этого будет напечатан «второй». super(First, self).__init__()
будет напечатан «первый». super(Third, self).__init__()
будет напечатан «это все». Это объясняет, почему создание экземпляра Third () приводит к:
>>> x = Third()
second
first
that's it
. Алгоритм MRO был улучшен с Python 2.3, чтобы хорошо работать в сложных случаях, но я думаю что использование «перемотки по глубине слева направо» + «удаление дубликатов ожидается для последнего» все еще работает в большинстве случаев (прокомментируйте, если это не так). Обязательно прочитайте сообщение в блоге Guido!
Если я правильно понял, вы просто хотите добавить перезагрузку после нажатия на одно из ваших ключевых слов.
Вы не уточнили, хотите ли вы сделать это только в PHP, поэтому я даю вам решение только для javascript.
/** {string} URL queries in string */
let urlQueriesString = window.location.search,
/** {string[]} URL queries in array */
urlQueriesArray = urlQueriesString.substring(1).split('&'),
/** {Object.<string, string>} URL queries in object */
urlQueries = {},
/** {string[]} List of search keywords */
searchKeywords = [],
/** {HTMLElement[]} List of <li> which will be inserted into DOM */
liElements;
// Fills in urlQueries object
for (let i in urlQueriesArray) {
urlQueriesArray[i] = urlQueriesArray[i].split('=');
urlQueries[urlQueriesArray[i][0]] = urlQueriesArray[i][1];
}
// Gets search keywords from _sft_category parameter
searchKeywords = urlQueries._sft_category.split('+'); // or .split(' ')
// Inserts a <li> in the DOM for each keyword
for (let i in searchKeywords) {
let ul = document.getElementsByTagName('ul')[0],
html = `<li>${searchKeywords[i]}</li>`;
ul.innerHTML += html;
}
// Gets inserted <li>
liElements = document.getElementsByTagName('li');
// Adds an event on click for each <li>
for (let i in liElements) {
let li = liElements[i];
// Checks instance type because last element of liElements is the length and we don't want to do what's following for this one
if (li instanceof HTMLElement) {
// Creates new URL on click
li.addEventListener('click', function() {
let url = window.location.hostname + window.location.pathname,
keyword = this.innerText;
searchKeywords = searchKeywords.filter((kw) => (kw !== keyword));
url += urlQueriesString.replace(/_sft_category=[\w\d_+-]+/, `_sft_category=${searchKeywords.join('+')}`);
console.log(url);
// Uncomment next line for reload with new url
// window.location.href = url;
});
}
}
<ul></ul>
Этот фрагмент кода может быть упрощен, но в настоящее время он должен выполнять свою работу.
Возможно, вам придется немного адаптировать его, чтобы он работал с вашим проектом.