>>> class A(object): pass
>>> def func(cls): pass
>>> A.func = func
>>> A.func
<unbound method A.func>
Как это присваивание создает метод? Кажется неинтуитивным, что присваивание делает для классов следующее:
- Превратите функции в несвязанные методы экземпляра
- Превратите функции, обернутые в
classmethod()
, в методы класса (на самом деле это довольно интуитивно понятно) - Превратите функции, обернутые в
staticmethod()
, в функции
Кажется, что для первого должна быть instancemethod()
, а для последнего вообще не должно быть функции-обертки. Я понимаю, что они предназначены для использования внутри блока class
, но почему они должны применяться за его пределами?
Но что более важно, как именно работает присвоение функции классу? Какая магия решает эти три проблемы?
Еще больше смущает вот это:
>>> A.func
<unbound method A.func>
>>> A.__dict__['func']
<function func at 0x...>
Но я думаю, что это как-то связано с дескрипторами при извлечении атрибутов. Я не думаю, что это как-то связано с настройкой атрибутов.