web-dev-qa-db-ja.com

len()およびdef __len __(self)の使用:クラスを構築する

ちょっと興味があるんだけど、

クラスを作成するときにlen()またはdef __len__()を使用することの間に違い(利点と欠点)はありますか?そして、最高のPythonスタイル?

   class foo(object):
      def __init__(self,obs=[])
         self.data = obs
         self.max = max(obs)
         self.min = min(obs)
         self.len = len(obs)

または

   class foo(object):
      def __init__(self,obs=[])
         self.data = obs
         self.max = max(obs)
         self.min = min(obs)
      def __len__(self):
         return len(self.data)
27
Gianni Spear

巨大の違いがあります。

__len__()メソッドはフックメソッドです。 len()functionは、オブジェクトの長さを照会するために___len___メソッドが存在する場合、それを使用します。

normal人々が使用することを期待しているAPIはlen()メソッドであり、代わりに_.len_属性を使用するとその標準から逸脱します。

_self.data_の長さが変更されないと予想される場合、属性の長さを常にキャッシュし、.__len__()がその属性を返すようにすることができます。

_class foo(object):
    def __init__(self, obs=None):
        if obs is None:  # provide a default if no list was passed in.
            obs = []
        self.data = obs
        self.max = max(obs)
        self.min = min(obs)
        self._data_len = len(obs)

    def __len__(self):
        return self._data_len
_
37
Martijn Pieters

いくつかの違いがあります。

  1. 2番目のアプローチのみが、fooの使い慣れたlen(obj)構文を提供します。最初はobj.len()が必要です。
  2. self.dataは、構築後に変更できます。2番目のバージョンのみが新しい長さを反映します。
6
NPE