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

标签 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

还有__cmp__()__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)

是否有一种神奇的方法可以让 sorted() 翻转不按顺序排列的元素?我正在描绘以下行为:

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

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

>>> type(t)
>>> SetOfTwo

最佳答案

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

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

关于python - 在 Python 中有 sorted() 的神奇方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868228/

相关文章:

python - 解释 3D 数组在内存中的间距、宽度、高度、深度

perl - 检查参数到 "use",然后传递其余的?

PHP:5.2.x 的 __callStatic 替代方案

php - 将 __set 与数组一起使用已解决,但为什么呢?

python - 无法从 Google Colab 外部的 Tensorflow 运行 CycleGan 示例

python - 安装Keras破坏了Conda虚拟环境(Windows 10)

java - 如果两个相同的对象具有不同的哈希码,有什么缺点

python - 关于在 Python 中定义一个 setter

python - 在 kivy-Garden-Mapview 的 python 端(不在 kv 文件中)的 MapMarkerPopup 中创建 Popup

php - Magento:从数据库中选择