Я не уверен, что есть много причин, чтобы оправдать хранилище, если только затраты на вычисления не велики каждый раз. См. Ответ hpaulj.
Однако, если вы действительно этого хотите, вы можете использовать свойство и даже возможно кэшировать его.
class MyList(list):
@property
def len_(self):
return len(self) #it's a list
or
_len_ = None
@property
def len_(self):
if self._len_ is None:
self._len_ = len(self)
return self._len_
def append(self, value):
self._len_ = None
super(MyList, self).append(value)
...and all other len-modifying methods also need to clear the cache.
Опять же, если вы кэшируете это, вы должны убедиться, что вы сбрасывали кэш каждый раз, когда ваш результат должен измениться. Что также является слабым местом в вашей идее хранения переменной экземпляра - дополнительную сложность убедиться, что у вас нет устаревших данных, вероятно, следует принимать только после того, как вы заявили, что это действительно узкое место в производительности.
(эти проблемы не помогли при использовании изменяемого аргумента по умолчанию для multiple_numbers
в вашем примере, кстати). В общем, если расширить это - если ваша сумма / длина зависит от состояния изменяемых элементов, то сохранение / кэширование вычислений - еще худшая идея. т.е. если MyList ссылается на объекты, которые сами имеют длину / сумму, которую нужно агрегировать, то MyList не имеет никакого отношения к кешированию / хранению.
В отношении именования, я бы, вероятно, go для того, что является полу-условное наименование, чтобы избежать дублирования встроенных / обычных имен, то есть добавление _
: cls
-> cls_
, list
-> list_
.