Как определить сеттер для списка с индексом или нарезкой? - PullRequest
0 голосов
/ 02 августа 2020

С помощью декоратора свойств и установщиков я могу определять функции получения и установки. Это нормально для примитивов, но как мне проиндексировать коллекцию или массив numpy? Кажется, что установка значений работает с индексом, но функция установки не вызывается. В противном случае функция печати в минимальном примере будет выполнена.

class Data:
    def __init__(self):
        self._arr = [0, 1, 2]

    @property
    def arr(self):
        return self._arr

    @arr.setter
    def arr(self, value):
        print("new value set")  # I want this to be executed
        self._arr = value


data = Data()

print(data.arr)  # prints [0, 1, 2]
data.arr[2] = 5
print(data.arr)  # prints [0, 1, 5]

1 Ответ

0 голосов
/ 02 августа 2020

Если вы хотите сделать это только для одного списка вашего экземпляра класса, вы можете сделать это способом с помощью методов __set_item__ и __get_item__ dunder класса:

class Data:
    def __init__(self):
        self._arr = [0, 1, 2]

    @property
    def arr(self):
        return self._arr

    @arr.setter
    def arr(self, value):
        print("new inner list set")
        self._arr = value

    def __setitem__(self, key, value):
        print("new value set")
        self._arr[key] =  value

    def __getitem__(self, key):
        return self._arr[key]

data = Data()

print(data.arr)

data[2] = 5
print(data.arr) 

data.arr = [42, 43]
print(data.arr) 

Вывод:

[0, 1, 2]

new value set        # by    data[2] = 5           using __set_item__
[0, 1, 5]

new inner list set   # by    data.arr = [42, 43]   using @arr.setter
[42, 43]

Это будет работать только для одного члена списка, потому что __set_item__ работают с самим экземпляром класса, а не со списком, который является членом экземпляра класса .

...