Мне интересно узнать о более сложных отличиях между функциями и вызываемыми объектами. Например, если вы выполните:
def foo1():
return 2 + 4
class foo2:
def __call__():
return 2 + 4
import sys
sys.getsizeof(foo1) # returns 136
sys.getsizeof(foo2) # returns 1016
Очевидно, что существует большая разница между функциями и вызываемыми объектами. Однако я не могу найти много документации о том, что происходит за кулисами. Я знаю, что функции являются первоклассными объектами, но я также знаю, что классы имеют гораздо больше возможностей, чем ваши обычные функции. класс foo2 создается с помощью метакласса type()
.
Теперь мои вопросы:
- Когда вы создаете функцию
def foo1():
, как это отличается от процесс определения класса с метаклассом? Существует ли версияtype()
, но для функций - метафункция? - Скажите, что кто-то хотел написать свой собственный метафунд (реальная причина этого), было бы лучше просто использовать декораторов или, может быть, метакласс, который делает вызываемые классы? Какие преимущества будут предлагать (метакласс, который делает вызываемые классы неуклюжими)?
- Единственная цель, заключающаяся в том, что вызываемый объект имеет функцию, которая также может хранить информацию в ней?