2016-05-16 4 views
0

Pythonでは、メンバーデータのゲッターとセッターは、一般的にプロパティの代わりにぶち壊されます。 reasonsは、計算と値を透過的に交換したい場合や、メンバーが単一の特急で読んで割り当てられる可能性のあるケースを強調します。ゲッターと読み取り専用または計算されたメンバーデータのプロパティ

わかりやすく割り当てられていないメンバーはどうなりますか?その場合にゲッターや財産を好む構造的な理由はありますか?

私が気にしている特定のケースは、キャッシュされる可能性のある計算されたメンバーを持つクラスです。

+0

私の本能は、読み取り専用のプロパティまたは計算されたメンバーのデータは、単なるメソッドである可能性があることを教えてくれました。 'get_computed_data()'、または 'computed_result'のように賢明に名前が付けられた属性である必要があります。それが割り当てのためではないことは非常に明白です。どちらも簡単にキャッシュできます – Anzel

答えて

1

これは、あなたが念頭に置いている特性がと認識される方法によって異なります。です。それは簡単にアクセスできる属性なのか、それとも「仕事」が必要なように見えなければならないのでしょうか?

あなたの特性がキャッシュされた値であり、アクセスのサイトがその特性の取得方法に影響を与える方法がない場合、ゲッター機能を使用しているということを示す必要があるということは、彼らがそれについて知る必要がないときに実行される必要があるプロセスがあること。なぜあなたはデザインによってあなたが知る必要がないと言う人が結果を考えさせるのですか?

ただし、ゲッターがアクセスする場所でコントロールする必要があるとします。たとえば、いくつかの条件のように、キャッシュを無効にすることができます。コンシューマーコードでは一般的ではないかもしれませんが、それはあなたが決定するためのものです。その場合は、キャッシュされたプロパティを取得するには、パラメータを持つゲッターが必要です。または、resetメソッドが必要です。

プロパティのメソッドよりもメソッドの方が優先される理由は、プロパティ記述子のアクセス時間がメソッド呼び出しよりもわずかに遅いため、プロパティを使用してタイトなループの深い部分にアクセスすると、キャッシュされたものであっても、測定可能な影響を与えることができます。

EDIT -

方法や記述子を取得する記述の明確化のコストは、あなたが名前の値を探しています。関数を使用している場合は、ルックアップの後に呼び出されます。ディスクリプタ(@property)を使用している場合、これが検出され、ディスクリプタの__get__メソッドが取得され、呼び出されます。つまり、ディスクリプタには追加のルックアップステップがあります。このコストは最小限であり、実用的には一般的には計り知れませんが、非常にのように頻繁に内部ループのようにアクセスされると、その価格が累積する可能性があります。

In [1]: class Method(object): 
    ...:  def get_my_value(self): 
    ...:   return 1 
    ...: 

In [2]: class Property(object): 
    ...:  @property 
    ...:  def my_value(self): 
    ...:   return 1 
    ...: 

In [3]: M = Method() 

In [4]: %timeit M.get_my_value() 
The slowest run took 14.74 times longer than the fastest. This could mean that an intermediate result is being cached 
10000000 loops, best of 3: 133 ns per loop 

In [5]: P = Property() 

In [6]: %timeit P.my_value 
The slowest run took 8.09 times longer than the fastest. This could mean that an intermediate result is being cached 
10000000 loops, best of 3: 181 ns per loop 
+0

メソッドが同等のプロパティより高速であると予想されるのはなぜですか? – Praxeolitic

+0

昨夜、メソッド対プロパティのパフォーマンス特性の更新を掲載しました。解決プロセスは通訳者の範囲内であるため、個々のルックアップステップおよび各パートの時間を測定することはできません。また、Python 3.5でhttp://bugs.python.org/issue23910に関連するプロパティ解決速度に関するいくつかの作業があります – mobiusklein

関連する問題