2016-03-30 6 views
1

Pythonパッケージのソースでこの構造体が見つかりました(おそらくもっと一般的です)。これで何ができますか?関数の構造体のプロパティを返すPython関数

def fie(x): 
    def foo(y): 
     return 123 
    return property(foo) 

私は結果と何もできないスクラッチパッドにしよう:

fie(3) 
<property object at 0x04D1BDE0> 

fie(3)(4) 
'property' object is not callable 
+0

'fie(3).fget(4)'は '123'を返しますが、私はこれが何であるか分かりません。 –

+2

このコードを見つけた場所や正確なコードそのものについて、もっと文脈を伝えてください。 'property(foo)'の呼び出しは、通常、クラス定義(https://docs.python.org/2/library/functions.html#property)の中で「管理属性」を定義するために使用されます。したがって、 'instance.fie'のようなことができ、' fie'を呼び出します。コードの周りにもっと文脈があるなら、著者がこれをやっている理由を知ることができます –

答えて

1

機能「FIEは」常にオン「123」を返すだけゲッターを持つデータ記述子を作成しますすべてのインスタンス「y」が使用されます。

例では、「X」を使用して混乱していないときに我々は、定数を戻す場合でもプロトコルで必要なパラメータ「Y」は、私たちはそれを少し変更してみましょう:

def fie(x): 
    def foo(y): 
     print "Returning x" 
     return x 
return property(foo) 

class Dog(object): 
    age = fie(3) 

>>> Dog.age 
<property object at 0x1050565d0> 

>>> pluto = Dog() 
>>> pluto.age 
Returning x 
3 
>>> pluto.age = 5 
Traceback (most recent call last): 
    File "<pyshell#239>", line 1, in <module> 
    pluto.age = 5 
AttributeError: can't set attribute 

として、あなたは私たちの新しい情けない機能と私たちはクラス上の一定の値で年齢という名前の属性を作成し、見ることができます。クラス上で呼び出されると、それはプロパティのプロトコルラッパーとして引き続き表示されますが、インスタンスプルートでは、それは魔法を起こします。また、ゲッターのみを定義したので、プロパティーは読み取り専用です。

クラスは、新しいスタイルのものでなければならないことに注意してください(すなわち対象から継承)、インスタンスの辞書内の実際の整数値に属性年齢を変更し、ラッパーをそれ以外の場合は割り当てがうまくいくと永遠に上書き:

class Dog2: 
    age = fie(7) 

>>> ploto = Dog2() 
>>> ploto.age 
Returning original x 
7 
>>> ploto.age = 8 
>>> ploto.age 
8 
+0

それだけです!この関数は、クラスの外部で宣言され、クラス内で複数の類似したメソッドを生成するために使用されます。この方法では、そのメソッドのコードを1回だけ入力する必要があります。また、クラスメソッドがプロパティのように動作するようにするには、property()関数を使用する必要があります。 – Bastiaan

関連する問題