#python
#python
Вопрос:
У меня есть существующий экземпляр списка, который в реальном коде содержит ссылки повсюду. Когда ссылка на список передается в определенную функцию, мне нужно убедиться, что все элементы в этом списке действительны с этого момента (проверьте все элементы списка, затем присоедините проверку для будущих изменений).
Создание нового класса, который переопределяет __setitem__
и поддерживает при выводе из list, обеспечивает требуемую проверку (PropertyList показан ниже). Проблема в том, что другие части кода указывают на ссылку на старый список, и поскольку это часть библиотеки, я не могу попросить разработчиков учесть это (это нарушает обратную совместимость и будет перегрызать код таким образом, чтобы поначалу его было незаметно).
Могу ли я в любом случае изменить класс элемента списка «live», чтобы все ссылки на список теперь вызывали модифицированные __setitem__
методы etc?
class PropertyList(list):
def __init__(self, validator, *args, **kwargs):
self.__validator = validator
super(PropertyList, self).__init__(*args, **kwargs)
def __setitem__(self, key, value):
value = self.__validator(value)
super(PropertyList, self).__setitem__(key, value)
def append(self, value):
value = self.__validator(value)
super(PropertyList, self).append(value)
def extend(self, other):
other = map(self.__validator, other)
super(PropertyList, self).extend(other)
def insert(self, index, value):
value = self.__validator(value)
super(PropertyList, self).insert(index, value)
Ответ №1:
Нет, это не так. Даже если вы могли бы заменить __class__
атрибут, вам не следует пытаться это делать, это сбивает с толку и может привести к сбоям. Если вам нужно создать список проверки, вам нужно создать новый объект и использовать его вместо старого.
Комментарии:
1. Я: я не могу найти способ изменения существующей ссылки на список, присвоенной повторяющемуся свойству. Гвидо ван Россум: его нет — вам нужно будет присвоить существующему списку атрибут class , но это не поддерживается для встроенных типов.