Как мне создать подкласс класса "list", который сортирует себя при создании экземпляра? - PullRequest
1 голос
/ 16 июня 2019

Я хочу создать SortedList, подкласс класса list.
Я хочу SortedList отсортировать себя при создании .

Например, с этим вводом:

x = SortedList([1, 9, 7])
print(x)

Я хотел бы получить этот вывод:

[1, 7, 9]

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

Я пробовал это, но это не работает:

class SortedList(list):
    def __init__(self, values):
        super().__init__()
        self.values = values
        self.sort(self.values)

Я немного растерялся.

Я использовал super() раньше, но я использовал его с суперклассами, которые я сделал, где я знал атрибуты. На этот раз я должен использовать super() со встроенным классом, поэтому я не уверен, какие атрибуты писать.

Пожалуйста, помогите.
Спасибо!

Ответы [ 2 ]

3 голосов
/ 16 июня 2019

Используйте это:

class SortedList(list):
    def __init__(self, values):
        super().__init__(sorted(values))

x = SortedList([1, 9, 7])
print(x)

A list может быть построен из итерируемого, например, из массива. Таким образом, мы можем передать отсортированную копию значений в супер-конструктор и позволить ему инициализировать свои атрибуты (нам не нужно знать внутренности list).

Обратите внимание, что если вы действительно хотите реализовать SortedList, вам придется переопределять другие методы!

2 голосов
/ 16 июня 2019

Ваш код будет содержать ошибку: TypeError: sort() takes no positional arguments.

self.sort имеет проблему, сортировка принадлежит list, а не экземпляру list или SortedList, self, вот экземпляр SortedList. Таким образом, использование list.sort(self.values) или self.values.sort() вместо self.sort(self.values) будет работать.

обновление: для большей ясности, с a = [1, 2, 3], a.sort() equals to list.sort(a). sort на самом деле не относится к экземпляру списка.

Извините за мой плохой английский. Я чувствую, что не очень хорошо выразил это ...

обновить еще раз: да, я могу показать информацию с кодом:

In [18]: a = [1, 2, 3]

In [19]: a.sort
Out[19]: <function list.sort(*, key=None, reverse=False)>
# but 
In [20]: a.sort is list.sort
Out[20]: False
# I think python makes some trick here...
# so...
In [21]: list.sort
Out[21]: <method 'sort' of 'list' objects>

В любом случае, я надеюсь, вы понимаете, почему self.sort(self.values) не может работать, с моим не очень выразительным объяснением.

Кажется, я забыл показать код, который может работать ...

На основании моего объяснения:

class SortedList(list):
    def __init__(self, values):
        super().__init__(values)
        super().sort()
x = SortedList([1, 3, 2])
print(x)
...