使用LEN()和高清__len __(个体经营):打造一流(Using len() and def

2019-07-20 15:53发布

只是好奇,

有没有使用任何区别(优缺点) 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)

Answer 1:

有一个巨大的差异。

所述__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


Answer 2:

有几个不同点:

  1. 只有第二种方法会给你熟悉的len(obj)语法foo 。 首先将需要obj.len()
  2. 如果长度self.data可以改变施工后,只有第二个版本将反映新长度。


文章来源: Using len() and def __len__(self): to build a class