【问题标题】:How do I create a Subclass of the "list" class, that sorts itself upon instantiation?如何创建“列表”类的子类,在实例化时对其进行排序?
【发布时间】:2019-10-30 01:57:12
【问题描述】:

我想创建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(),所以我不确定要写什么属性。

请帮忙。
谢谢!

【问题讨论】:

    标签: python python-3.x list oop super


    【解决方案1】:

    使用这个:

    class SortedList(list):
        def __init__(self, values):
            super().__init__(sorted(values))
    
    x = SortedList([1, 9, 7])
    print(x)
    

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

    请注意,如果您真的想实现 SortedList,则必须继续覆盖其他方法!

    【讨论】:

    • 这个答案可以通过解释为什么提问者的解决方案不起作用来改进。
    【解决方案2】:

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

    self.sort 有问题,排序属于list,而不是listSortedList 的实例,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)
    

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 2012-10-12
      • 2014-06-29
      • 2014-08-24
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多