1

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か?

4

1 に答える 1

3

クラスは記述子、つまり実装Cである必要があります。次に、最初に記述子の を呼び出し、X インスタンスと X への参照を渡します。__get__X().f()__get____get____call__

于 2013-02-01T15:47:06.783 に答える