36

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

クラスを使用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)
4

2 に答える 2

56

大きな違いがあります。

__len__()メソッドはフックメソッドです。このlen() 関数は、存在する場合はメソッドを使用して__len__、オブジェクトの長さを照会します。

人々が使用することを期待する通常の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
于 2013-02-27T14:04:59.113 に答える
9

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

  1. 2 番目のアプローチのみが、使い慣れた のlen(obj)構文を提供しfooます。最初は が必要ですobj.len()
  2. の長さがself.data構築後に変更される可能性がある場合、2 番目のバージョンのみが新しい長さを反映します。
于 2013-02-27T14:05:32.710 に答える