#python #list
#python #Список
Вопрос:
Я хотел бы создать всплывающую замену для python list
, которая позволит мне знать, когда элемент добавлен или удален. Подкласс list или что-то, что реализует интерфейс list, будет работать одинаково хорошо. Я бы предпочел решение, в котором мне не нужно переопределять всю функциональность списка. Есть ли простой pythonic способ сделать это?
Псевдокод:
class MyList(list):
# ...
def on_add(self, items):
print "Added:"
for i in items:
print i
# and the same for on_remove
l = MyList()
l = [1,2,3]
# etc.
Комментарии:
1. Я думаю, вам нужно переопределить
append
,extend
и (немного сложнее)__setitem__
.2. Вместо переопределения
list
(что правильно, но немного сложно) вы могли бы написать небольшую оболочку над списком, реализующую только тот API, который вам нужен.
Ответ №1:
Чтобы увидеть, какие функции определены в списке, вы можете сделать
>>> dir(list)
Затем вы увидите, что вы можете переопределить, попробуйте, например, это:
class MyList(list):
def __iadd__(self, *arg, **kwargs):
print "Adding"
return list.__iadd__(self, *arg, **kwargs)
Вероятно, вам нужно выполнить еще несколько из них, чтобы получить все это.
Комментарии:
1.
__iadd__
это было. Я попробовал с__setitem__
и задавался вопросом, почему элемент управления не выполнял это.
Ответ №2:
Документация для userlist сообщает вам о создании подкласса, list
если вам не требуется, чтобы ваш код работал с Python <2.2. Вероятно, вам не удастся переопределить хотя бы методы, которые позволяют добавлять / удалять элементы. Будьте осторожны, это включает в себя операторы нарезки.