Классы и функции имеют собственное имя:
>>> def foo():
... pass
...
>>> foo
<function foo at 0x10f951400>
>>> foo.__name__
'foo'
Имя, прикрепленное к объекту, не зависит от имени, которое вы используете для доступа к объекту, хотя при определении функций (и классов) они совпадают.
>>> bar = foo
>>> bar
<function foo at 0x10f951400>
Вы даже можете избавиться от переменной, которую используете для доступа к функции, если у вас есть ссылка где-то еще:
>>> funcs = [foo]
>>> funcs[0]
<function foo at 0x10f951400>
>>> del foo
>>> foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> funcs[0]
<function foo at 0x10f951400>
>>> funcs[0].__name__
'foo'
Тип встроенной функции такой: нет переменной, которая ссылается на него, но она все еще существует и имеет __name__
:
>>> def foo(): pass
...
>>> type(foo)
<class 'function'>
>>> type(foo).__name__
'function'