Почему list .__ repr__ не использует list .__ getitem__? - PullRequest
0 голосов
/ 30 апреля 2019

Я переопределил __getitem__ встроенного типа list:

class my_list(list):
    def __getitem__(self, index, *args, **kwargs):
        value = super().__getitem__(index, *args, **kwargs)
        if isinstance(index, slice): 
            return [v**2 for v in value]
        return value**2

и создали его новый экземпляр:

a = my_list((1, 2, 3, 4))

и repr(a), и print(a) выводят одинаковое неизмененное значение [1, 2, 3, 4] без вызова переопределения __getitem__. Я ожидаю получить [1, 4, 9, 16] в обоих этих случаях.

Однако, a[2], a[:] вызывает __getitem__, и результаты соответственно 9 и [1, 4, 9, 16]. Как и ожидалось.

Как переопределить один метод для создания согласованного представления моего пользовательского списка? Или какие методы мне нужно переопределить, чтобы охватить все способы получения значений из моего пользовательского списка?

1 Ответ

1 голос
/ 30 апреля 2019

Как переопределить один метод для создания согласованного представления моего пользовательского списка?

Конкретные реализации обычно не гарантируют, что для таких вещей будет доступен один методособенно встроенные, часто из соображений эффективности.

Если вы хотите, чтобы все проходило через один метод или известный код, вместо подтипа создайте последовательность обертку (используя Sequenceили MutableSequence ), таким образом, вы точно знаете, что и где реализовано, и в конечном итоге можете делегировать обернутый объект, когда захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...