Метод
blockquote>EventTarget.removeEventListener()
удаляет из EventTarget прослушиватель событий, ранее зарегистрированный в EventTarget.addEventListener (). Прослушиватель событий, который необходимо удалить, идентифицируется с использованием комбинации типа события, самой функции прослушивателя событий и различных необязательных опций, которые могут влиять на процесс сопоставления.Когда вы используете
Function#bind
, методbind()
создает новую функцию , для которой при вызове для этого ключевого слова установлено ключевое значение с заданной последовательностью аргументов, предшествующей любому, предоставленному при вызове новой функции.Следовательно, при использовании
removeEventListener
вы не передаете ту же ссылку на функцию, которая была добавлена дляaddEventListener
.Кэшировали
Handler function
в переменную, которая может использоваться для обоих,addEventListener
, а такжеremoveEventListener
let handlerFunction = handler.bind(null, name, callback); document.addEventListener(name, handlerFunction, false); document.removeEventListener(name, handlerFunction, false);
Как уже отмечалось, аргументы ключевых слов со значениями по умолчанию могут иметь большое значение.
Я также утверждаю, что На мой взгляд, это противоречит духу Python - беспокоиться о том, какие типы передаются в методы. В Python я думаю, что более приемлемо использовать типизацию утилит - спрашивать, что может делать объект, а не то, чем он является.
Таким образом, если ваш метод может принимать строку или кортеж, вы можете сделать что-то вроде этого:
def print_names(names):
"""Takes a space-delimited string or an iterable"""
try:
for name in names.split(): # string case
print name
except AttributeError:
for name in names:
print name
Тогда вы можете сделать одно из следующих:
print_names("Ryan Billy")
print_names(("Ryan", "Billy"))
Хотя такой API иногда указывает на проблему проектирования.
Теперь, если вы не пытаетесь писать код C ++ с использованием синтаксиса Python, для чего вам нужна перегрузка?
Я думаю, что это совсем наоборот, перегрузка необходима только для того, чтобы заставить строго типизированные языки вести себя как Python. В Python у вас есть ключевое слово аргумент, у вас есть * args
и ** kwargs
.
См. Например: Что такое чистый, питонский способ иметь несколько конструкторов в Python?
вам не нужна перегрузка функций, так как у вас есть аргументы * args и ** kwargs.
Дело в том, что перегрузка функций основана на идее, что при передаче разных типов вы будете выполнять другой код. Если у вас есть динамически типизированный язык, такой как python, вы не должны различать по типу, но вы должны иметь дело с интерфейсами и их соответствием написанному вами коду.
Например, если у вас есть код, который может обрабатывать либо целое число, либо список целых чисел, вы можете попытаться повторить его, и если вы не можете, то вы предполагаете, что это целое число и идете вперед. Конечно, это может быть float, но что касается поведения, если float и int кажутся одинаковыми, то их можно взаимозаменять.
Oftentimes you see the suggestion use use keyword arguments, with default values, instead. Look into that.
Вы можете передать изменяемый тип данных контейнера в функцию, которая может содержать все, что вы хотите.
Если вам нужно другую функциональность, называйте функции по-разному, или, если U нужен один и тот же интерфейс, просто напишите интерфейсную функцию (или метод), которая вызывает функции соответствующим образом на основе полученных данных.
Мне потребовалось некоторое время, чтобы приспособиться к это происходит из Java, но это действительно не "большой гандикап"