Ответ 1
Как вы говорите, это не лучший способ сделать это. Чтобы правильно реализовать это, вам нужно знать о каждом методе, который может изменить список.
Путь к реализации - реализовать свой собственный список (или, скорее, изменяемую последовательность). Лучший способ сделать это - использовать абстрактные базовые классы из Python, которые вы найдете в модуле collections.abc
. Вы должны реализовать только минимальное количество методов, и модуль автоматически реализует остальное для вас.
В вашем конкретном примере это будет примерно так:
from collections.abc import MutableSequence
class MyList(MutableSequence):
def __init__(self, iterable=()):
self._list = list(iterable)
def __getitem__(self, key):
return self._list.__getitem__(key)
def __setitem__(self, key, item):
self._list.__setitem__(key, item)
# trigger change handler
def __delitem__(self, key):
self._list.__delitem__(key)
# trigger change handler
def __len__(self):
return self._list.__len__()
def insert(self, index, item):
self._list.insert(index, item)
# trigger change handler
Производительность
Некоторые методы медленны в реализации по умолчанию. Например, __contains__
определяется в Sequence
class следующим образом:
def __contains__(self, value):
for v in self:
if v is value or v == value:
return True
return False
В зависимости от вашего класса вы сможете реализовать это быстрее. Однако производительность часто менее важна, чем написание кода, который легко понять. Это также может сделать запись класса сложнее, потому что тогда вы ответственны за правильность реализации методов.