これは、あなたが念頭に置いている特性がと認識される方法によって異なります。です。それは簡単にアクセスできる属性なのか、それとも「仕事」が必要なように見えなければならないのでしょうか?
あなたの特性がキャッシュされた値であり、アクセスのサイトがその特性の取得方法に影響を与える方法がない場合、ゲッター機能を使用しているということを示す必要があるということは、彼らがそれについて知る必要がないときに実行される必要があるプロセスがあること。なぜあなたはデザインによってあなたが知る必要がないと言う人が結果を考えさせるのですか?
ただし、ゲッターがアクセスする場所でコントロールする必要があるとします。たとえば、いくつかの条件のように、キャッシュを無効にすることができます。コンシューマーコードでは一般的ではないかもしれませんが、それはあなたが決定するためのものです。その場合は、キャッシュされたプロパティを取得するには、パラメータを持つゲッターが必要です。または、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
私の本能は、読み取り専用のプロパティまたは計算されたメンバーのデータは、単なるメソッドである可能性があることを教えてくれました。 'get_computed_data()'、または 'computed_result'のように賢明に名前が付けられた属性である必要があります。それが割り当てのためではないことは非常に明白です。どちらも簡単にキャッシュできます – Anzel