質問

Pythonデコレータのアプリケーションが私が適用した関数で何をしたかを見る方法はあります。たとえば、

がある場合
class A(object):

   @property
   def something(self):
       return 0
.

somethingに実行されているコードが実際にどのように見えますか。これを行う方法はありますか?

役に立ちましたか?

解決

デコレータはコードを生成しません。デコレータは本当に構文砂糖のみです:

@property
def something(self):
    return 42
.

は実際に解釈されています。

def something(self):
    return 42
something = property(something)
.

e.g。 @記号に続く式が評価され、結果は呼び出され、@行の後に関数またはクラスを渡します。デコレータがを返すものがのオブジェクトのオブジェクトを返します。

イントロスペクション目的で、@ラインはが保持されていません。あなたは存在する装飾者を発見するためにソースコード自体を解析する必要があります。デコレータは新しいオブジェクトを返す義務を負いません。元のオブジェクトを変更できなくなり、イントロスペクションでは違いを知ることはできません。

あなたの最善の策はデコレータのソースに戻ることです、そしてそのコードを読むだけです。 propertyデコレータはCで実装されていますが、記述子HOWTO Pythonが含まれています同じことをする実装:

class Property(object):
    "Emulate PyProperty_Type() in Objects/descrobject.c"

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        if doc is None and fget is not None:
            doc = fget.__doc__
        self.__doc__ = doc

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError("unreadable attribute")
        return self.fget(obj)

    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError("can't set attribute")
        self.fset(obj, value)

    def __delete__(self, obj):
        if self.fdel is None:
            raise AttributeError("can't delete attribute")
        self.fdel(obj)

    def getter(self, fget):
        return type(self)(fget, self.fset, self.fdel, self.__doc__)

    def setter(self, fset):
        return type(self)(self.fget, fset, self.fdel, self.__doc__)

    def deleter(self, fdel):
        return type(self)(self.fget, self.fset, fdel, self.__doc__)
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top