2

通常、記述子は次のようにクラス属性で使用されます。

class Owner(object):
    attr = Attr()

を取得するときOwner.attr、 where 、およびAttr.__get__(self, instance, owner)が呼び出されます。self = Owner.attrinstance = Noneowner = Owner

Ownerインスタンス化instanceされると、 のインスタンスになりますOwner

ここで、この概念をクラス属性ではなくメソッド パラメーターに適用したいと思います。

実際にどのように見えるか ( の機能がAttr、特定の文字列で文字列をラップすることであると仮定しましょう):

class Example(object):
    def funct(self, param=Attr('t')):
        return param == 'test' # < param calls the descriptor here

e = Example()
e.funct('es') # < is True because 'es' wrapped with 't' becomes 'test'.

にアクセスするときparam、は、andAttr.__get__(self, instance, owner)で呼び出されます( andを同じにする意味はありませんが、 ? かもしれません)。しかし、クラスではないため、これは機能しません。どうすれば仕事に似たものを手に入れることができますか?self = funct.paraminstance = functowner = functownerinstanceNonefunct

関数のデコレーターがパラメーターを処理するため、これが解決策に追加される可能性があります。たとえば、デコレータはラッパー文字列を変更できる必要があります。

4

1 に答える 1

2

関数は実際には Python のファースト クラス オブジェクトですが、記述した構文が思いどおりに機能しないというのは正しいことです。ただし、この種の機能を有効にする特性について、渡された属性を検査するデコレーターを使用して、このようなことを実行できる可能性があります。ただし、呼び出し可能なオブジェクトを実装してから、それに記述子をアタッチし、関数ではなく呼び出し可能なオブジェクトのインスタンスを作成する方がよいでしょう。

于 2013-04-30T13:08:25.707 に答える