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__方法(如果存在)来查询您的对象的长度。

人们期望使用的普通len()API 是方法,而使用.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. 只有第二种方法会为您提供熟悉len(obj)foo. 第一个将需要obj.len().
  2. 如果 的长度self.data可以在构建后更改,则只有第二个版本会反映新的长度。
于 2013-02-27T14:05:32.710 回答