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

Gia*_*ear 29 python optimization coding-style class

只是好奇,

使用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)
Run Code Online (Sandbox Code Playgroud)

要么

   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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 40

很大的不同.

__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
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 6

有几个不同之处:

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