Python 3 にはバインドされたメソッドはありません (Python 2 から知られています) が、常に関数を作成します。
クラス内で関数を宣言した後、何かが自動 Pythons 記述子を作成しています。この記述子はself
、この関数がインスタンス メソッドとして呼び出されるときに、最初の引数として追加されます。
基本的に、次のコード:
def funcdecorator(func):
def f(*args, **kwargs):
print('funcdecorator:', args, kwargs)
return f
class X:
@funcdecorator
def f(self):
pass
X().f()
出力します:
funcdecorator: (<__main__.X object at ...>,) {}
(最初の引数は として渡されますself
)
ただし、次のコードを使用します。
def classdecorator(func):
class C:
def __call__(*args, **kwargs):
print('classdecorator:', args, kwargs)
return C()
class X:
@classdecorator
def f(self):
pass
X().f()
我々が得る:
classdecorator: (<__main__.C object at 0x1bbea10>,) {}
これは論理的です。
しかし、デコレータからクラスインスタンスを返し、それが関数であることを模倣することは可能X
ですC
か?