68

Python クラスでは、@property は、明示的なセッター関数とゲッター関数の使用を避ける優れたデコレータです。ただし、「従来の」クラス関数の 2 ~ 5 倍のオーバーヘッドが発生します。私の場合、これはプロパティを設定する場合にはまったく問題なく、設定時に実行する必要がある処理に比べてオーバーヘッドは重要ではありません。

ただし、プロパティを取得する際の処理は必要ありません。それは常に「return self.property」です。別の内部変数を使用する必要なく、セッターを使用するがゲッターを使用しないエレガントな方法はありますか?

以下のクラスには、内部変数「_var」を参照するプロパティ「var」があります。「_var」よりも「var」を呼び出す方が時間がかかりますが、開発者とユーザーが同様に「_var」を追跡する必要なく「var」を使用できると便利です。

class MyClass(object):
  def __init__(self):
    self._var = None

  # the property "var". First the getter, then the setter
  @property
  def var(self):
    return self._var
  @var.setter
  def var(self, newValue):
    self._var = newValue
    #... and a lot of other stuff here

  # Use "var" a lot! How to avoid the overhead of the getter and not to call self._var!
  def useAttribute(self):
    for i in xrange(100000):
      self.var == 'something'

興味のある方のために、私の PC では、「var」の呼び出しに平均 204 ns かかり、「_var」の呼び出しには平均 44 ns かかります。

4

4 に答える 4