Подтвердить что ты не робот

Использование len() и def __len __ (self): для создания класса

Просто любопытно,

Есть ли разница (преимущества и недостатки) между использованием 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)
4b9b3361

Ответ 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

Ответ 2

Существует несколько отличий:

  • Только второй подход даст вам знакомый синтаксис len(obj) для foo. Для первого потребуется obj.len().
  • Если длина self.data может меняться после построения, только вторая версия будет отражать новую длину.