使用len()和def __len __(self):构建一个类

时间:2013-02-27 14:03:27

标签: python class optimization coding-style

好奇,

在构建类时使用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)

2 个答案:

答案 0 :(得分:37)

存在巨大的差异。

__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

答案 1 :(得分:6)

有几点不同:

  1. 只有第二种方法会为len(obj)提供熟悉的foo语法。第一个将需要obj.len()
  2. 如果self.data的长度可以在构造后更改,则只有第二个版本会反映新的长度。