使用len()和def len(self):构建类

2024-05-14 08:57:27 发布

您现在位置:Python中文网/ 问答频道 /正文

只是好奇

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

Tags: selfdatalenobjectfooinit风格def
2条回答

有一个巨大的差异。

__len__()方法是一个钩子方法。如果存在len()函数将使用__len__方法查询对象的长度。

人们期望使用的normalAPI是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. 只有第二种方法才能为foo提供熟悉的len(obj)语法。第一个需要obj.len()
  2. 如果self.data的长度可以改变构建后的长度,则只有第二个版本将反映新的长度。

相关问题 更多 >

    热门问题