Python中有sorted()的神奇方法吗?

gre*_*grf 7 python oop magic-methods

我知道Python中有一些神奇的方法可以被类覆盖,以控制某些内置函数处理这些类的成员的方式。例如,len()和的行为可以通过魔术方法和str()覆盖:__len__()__str__()

class EmptySet(object):
    def __len__(self):
        return 0

    def __str__(self):
        return '[]'

>>> e = EmptySet()
>>> str(e)
[]

>>> len(e)
0
Run Code Online (Sandbox Code Playgroud)

还有__cmp__()and__ge__()__le__()方法来控制如何比较这些对象以及如何对它们的列表进行排序list.sort()。我的问题不是关于自定义列表中对象的顺序,而是关于对对象本身进行排序。假设该集合不为空并且我想用sorted()它来排序:

class SetOfTwo(object):
    def __init__(self, a , b):
        el_0 = a
        el_1 = b

    def __len__(self):
        return 2

    def __str__(self):
        return '[{}, {}]'.format(el_0, el_1)
Run Code Online (Sandbox Code Playgroud)

sorted()如果元素不按顺序排列,我可以实现一种神奇的方法来翻转元素吗?我正在想象以下行为:

>>> s = SetOfTwo(2, 1)
>>> str(s)
[2, 1]

>>> t = sorted(s)
>>> str(t)
[1, 2]

>>> type(t)
>>> SetOfTwo
Run Code Online (Sandbox Code Playgroud)

Elm*_*lmo 5

您绝对应该阅读有关如何模拟容器类型的官方文档。基本上,一个应该作为容器(列表、字典等)工作的类需要实现方法来设置或获取成员__getitem__()__setitem__()并迭代项目__iter__()并获取项目数量 - 方法__len__()这是最小值。但您还可以添加删除项目和其他操作的功能。

内置函数的行为sorted()是迭代容器的元素并使用您提到的方法对它们进行比较,__cmp__(), __ge__(), __le__()这些方法应该为项目而不是您已经知道的容器定义。然后创建一个新list实例,其中项目已排序,并返回该新实例。然后您可以将其传递给自定义容器的构造函数,或者您可以sorted()使用自定义函数进行包装,该函数将返回所需的类实例。