Все данные в программе Python представлены объектами или отношениями между объектами. Такие вещи, как строки, списки, модули и функции, являются объектами. В Python нет ничего особенного в функциях.
Так как функция в Python является объектом, ее можно присвоить другой переменной, как и любому другому объекту:
def hello(name):
return f'Hello {name}.'
>>> say = hello
Строка say = hello
не вызывает функцию. Он принимает объект функции, на который ссылается hello
и создает второе имя say
указывающее на нее. Теперь можно выполнить объект базовой функции hello
, вызвав say
:
>>> say('World')
# 'Hello World.'
Функциональные объекты и их имена являются двумя разными вещами. Вот еще одно доказательство: можно удалить исходное имя функции hello
. Другое имя say
по-прежнему указывает на базовую функцию hello
и ее можно вызвать через функцию say
:
>>> del hello
>>> hello('World')
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# NameError: name 'hello' is not defined
>>> say('World')
# 'Hello World.'
Python присоединяет строковый идентификатор к каждой функции во время создания для целей отладки. Можете получить доступ к этому внутреннему идентификатору с помощью атрибута __name__
или __qualname__
:
>>> say.__name__
'hello'
>>> say.__qualname__
'hello'
Хотя атрибут __name__
функции say()
все еще hello
, это не повлияет на то, как можно получить к ней доступ из кода. Этот атрибут является просто средством отладки. Переменная, указывающая на функцию и имя самой функции две разные вещи.