Есть ли в Python и Go делегаты?

Погуглил в интернете и сложилось впечатление, что в Python и Go делегатов нет. Редкие упоминания их наличия походу являются какими-то самописными велосипедами.

Так ли это? Если да почему их в языки не добавили? Они усложняют язык? Что вместо них?
  • Вопрос задан
  • 4371 просмотр
Пригласить эксперта
Ответы на вопрос 3
Bahusss
@Bahusss
Python Master
Делегирование - это шаблон проектирования, и реализовать его можно на большинстве современных языков программирования. Пример для Python есть в вики, никаких дополнительных ключевых слов для реализации делегатов в питоне не требуется, т.к. любой метод можно передать в качестве параметра куда угодно. Так же можно помещать методы в структуры данных, вот пример:

def say_hello(name):
    print 'Hello,', name

def say_goodbye(name):
    print 'Bye,', name

phrases = {
    'hello': say_hello,
    'bye': say_goodbye,
}

def say(what, name):
    phrases[what](name)

say('hello', 'Ivan')
say('bye', 'Oleg')


В Go этот паттерн реализуется тоже очень лаконично.
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
В Python функции являются гражданами первого класса, их можно передавать в качестве аргументов другим функциям и хранить в словарях-массивах-тьюплах. Поэтому необходимости в такой концепции, как делегаты, просто нет.
Ответ написан
Nipheris
@Nipheris Куратор тега C#
Если используете терминологию C#, то и поставили бы тег, больше бы ответили.
Если нет, пропустите этот ответ.

В большинстве языков возможность работать с функциями как со значениями называется first-class function values или first-class function objects, а возможность привязки некоторых данных к функции (точнее, к некоторым внутренним переменным функции, не являющихся ее параметрами) - замыканием (closure). Делегаты шарпа это фактически те же function object, они сейчас чаще так и называются. Есть правда и важное отличие, касающееся multicast-делегатов - во многих языках такой возможности нет, но это пожалуй единственное важное отличие, и его в общем-то несложно нивелировать. А вообще в питоне функциональные объекты и замыкания отлично поддерживаются, поддерживается в том числе привязка метода к объекту с помощью точки (obj.method), например:
>>> class A:
...     def print_me(self):
...         print(self.v)
...
>>> a = A()
>>> a.v = 91
>>> a.print_me()
91
>>> f = a.print_me
>>> a.v = 155
>>> f()
155
>>>

Вот туториал: https://newcircle.com/bookshelf/python_fundamental...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы