我知道 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/