Шаг 33.
Python: тонкости программирования. Эффективные функции. Функции Python - это объекты первого класса. Функции - это объекты

    На этом шаге мы рассмотрим, какие особенности возникают из того факта, что функции - это объекты.

    Все данные в программе Python представляются объектами или связями между объектами.


См. документацию Python "Объекты, значения и типы": https://docs.python.org/3/reference/datamodel.html#objects-values-and-types.

    Символьные последовательности (строки), списки, модули и функции - все эти явления языка представляют собой объекты. Что касается функций, то в Python они ничем не отличаются. Они - тоже объекты.

    Поскольку функция yell() в Python является объектом, вы можете ее присвоить еще одной переменной, точно так же, как это происходит с любым другим объектом:

>>> bark = yell

    Эта строка кода не вызывает функцию. Она берет объект-функцию, на который ссылается имя yell, и создает второе имя, bark, которое на него указывает. Теперь вы можете исполнить тот же самый объект-функцию, который лежит в его основе, вызвав bark:

>>> bark('гав')
'ГАВ!'

    Объекты-функции и их имена - это две отдельные компетенции. Вот еще одно доказательство. Вы можете удалить первоначальное имя функции (yell), и, поскольку еще одно имя (bark) по-прежнему указывает на лежащую в основе функцию, вы все так же можете через него вызвать эту функцию:

>>> del yell
>>> yell('Привет?')
Traceback (most recent call last):
NameError: name 'yell' is not defined
>>> bark('эй')
'ЭЙ!'

    Кстати, Python прикрепляет к каждой функции строковый идентификатор. Это делается для отладочных целей во время создания функции. К этому внутреннему идентификатору можно получить доступ посредством атрибута __name__.

>>> bark.__name__
'yell'


Начиная с Python 3.3, также имеется атрибут __qualname__, который служит для такой же цели и обеспечивает строку с квалифицированным именем для устранения неоднозначности между именами функций и классов (см. PEP 3155: https://www.python.org/dev/peps/pep-3155/s).

    Нужно сказать, что хотя атрибут __name__ функции по-прежнему "yell", это не влияет на то, каким образом вы получаете доступ к объекту-функции из вашего программного кода. Идентификатор имени является просто средством отладки. Указывающая на функцию переменная и сама функция обладают совершенно разными компетенциями.

    На следующем шаге мы рассмотрим, где могут располагаться функции.




Предыдущий шаг Содержание Следующий шаг