Перегрузка функции в Python: То, чтобы избегать [закрывается]

Метод EventTarget.removeEventListener() удаляет из EventTarget прослушиватель событий, ранее зарегистрированный в EventTarget.addEventListener (). Прослушиватель событий, который необходимо удалить, идентифицируется с использованием комбинации типа события, самой функции прослушивателя событий и различных необязательных опций, которые могут влиять на процесс сопоставления.

blockquote>

Когда вы используете 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);
61
задан Matthew Cornell 6 September 2012 в 20:09
поделиться

5 ответов

Как уже отмечалось, аргументы ключевых слов со значениями по умолчанию могут иметь большое значение.

Я также утверждаю, что На мой взгляд, это противоречит духу 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 иногда указывает на проблему проектирования.

33
ответ дан Ryan Ginstrom 24 November 2019 в 17:18
поделиться

Теперь, если вы не пытаетесь писать код C ++ с использованием синтаксиса Python, для чего вам нужна перегрузка?

Я думаю, что это совсем наоборот, перегрузка необходима только для того, чтобы заставить строго типизированные языки вести себя как Python. В Python у вас есть ключевое слово аргумент, у вас есть * args и ** kwargs .

См. Например: Что такое чистый, питонский способ иметь несколько конструкторов в Python?

36
ответ дан Community 24 November 2019 в 17:18
поделиться

вам не нужна перегрузка функций, так как у вас есть аргументы * args и ** kwargs.

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

Например, если у вас есть код, который может обрабатывать либо целое число, либо список целых чисел, вы можете попытаться повторить его, и если вы не можете, то вы предполагаете, что это целое число и идете вперед. Конечно, это может быть float, но что касается поведения, если float и int кажутся одинаковыми, то их можно взаимозаменять.

22
ответ дан Stefano Borini 24 November 2019 в 17:18
поделиться

Oftentimes you see the suggestion use use keyword arguments, with default values, instead. Look into that.

6
ответ дан unwind 24 November 2019 в 17:18
поделиться

Вы можете передать изменяемый тип данных контейнера в функцию, которая может содержать все, что вы хотите.

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

Мне потребовалось некоторое время, чтобы приспособиться к это происходит из Java, но это действительно не "большой гандикап"

6
ответ дан Lakshman Prasad 24 November 2019 в 17:18
поделиться
Другие вопросы по тегам:

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