繁体   English   中英

如何创建“列表”类的子类,该子类在实例化时进行排序?

[英]How do I create a Subclass of the “list” class, that sorts itself upon instantiation?

我想创建SortedList ,它是list类的子类。
我希望SortedList 在实例化时对其进行排序

例如,使用以下输入:

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

我想要这个输出:

[1, 7, 9]

我是一个初学者。 我知道可能有一些更好的函数或数据类型,但是我想练习我的dunder方法和OOP技能。

我试过了,但是没有用:

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

我有点困惑。

我以前使用过super() ,但我将其用于我所知道的属性的超类。 这次,我必须对内置类使用super() ,所以我不确定要写什么属性。

请帮忙。
谢谢!

用这个:

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

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

list可以从可迭代对象(例如从数组)构建。 因此,我们可以将值的排序副本传递给super构造函数,并让它初始化其属性(我们不必知道list的内部)。

请注意,如果您确实要实现SortedList,则必须继续重写其他方法!

您的代码将有错误: TypeError: sort() takes no positional arguments

self.sort有问题,sort属于list ,不是listSortedList实例,这里的selfSortedList实例。 因此,可以使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM