>>> class A(object): pass
>>> def func(cls): pass
>>> A.func = func
>>> A.func
<unbound method A.func>
この割り当てはどのようにメソッドを作成しますか? 割り当てがクラスに対して次のことを行うのは直感的ではないようです。
- 関数をバインドされていないインスタンス メソッドに変換する
- ラップされた関数
classmethod()をクラス メソッドに変換します (実際、これは非常に直感的です)。 - ラップさ
staticmethod()れた関数を関数に変換する
最初のものには が必要でinstancemethod()、最後のものにはラッパー関数がまったくないはずです。これらがブロック内で使用されることは理解していますclassが、なぜブロック外に適用する必要があるのでしょうか?
しかし、もっと重要なことは、クラスへの関数の割り当てはどのように機能するのでしょうか? これら3つのことを解決する魔法は何ですか?
これでさらに混乱します:
>>> A.func
<unbound method A.func>
>>> A.__dict__['func']
<function func at 0x...>
しかし、属性を取得するとき、これは記述子と関係があると思います。ここでの属性の設定とはあまり関係がないと思います。