簡単な答え: バインドされたメソッドにカスタム属性を追加する方法はありません。
長い答えが続きます。
Python には、関数オブジェクトとメソッド オブジェクトがあります。クラスを定義すると、def
ステートメントはクラスの名前空間内に存在する関数オブジェクトを作成します。
>>> class c:
... def m(self):
... pass
...
>>> c.m
<function m at 0x025FAE88>
関数オブジェクトには、__dict__
ユーザー定義の属性を保持できる特別な属性があります。
>>> c.m.i = 0
>>> c.m.__dict__
{'i': 0}
メソッド オブジェクトは別の獣です。__func__
これらは、対応する関数オブジェクトへの参照 ( ) とそのホスト オブジェクトへの参照 ( ) を保持するだけの小さなオブジェクトです__self__
。
>>> c().m
<bound method c.m of <__main__.c object at 0x025206D0>>
>>> c().m.__self__
<__main__.c object at 0x02625070>
>>> c().m.__func__
<function m at 0x025FAE88>
>>> c().m.__func__ is c.m
True
メソッド オブジェクトは__getattr__
、関数オブジェクトへの属性アクセスを転送する特別な機能を提供します。
>>> c().m.i
0
__dict__
これは、プロパティにも当てはまります。
>>> c().m.__dict__['a'] = 42
>>> c.m.a
42
>>> c().m.__dict__ is c.m.__dict__
True
ただし、属性の設定はデフォルトのルールに従います。独自の を持たないため、__dict__
任意の属性を設定する方法はありません。
これは、存在しないスロットを設定しようとすると、スロットを定義__slots__
しないユーザー定義クラスに似ています(詳細については、ドキュメントを参照してください)。__dict__
AttributeError
__slots__
>>> class c:
... __slots__ = ('a', 'b')
...
>>> x = c()
>>> x.a = 1
>>> x.b = 2
>>> x.c = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'c' object has no attribute 'c'