我知道python中有一些神奇的方法可以被类覆盖,以控制某些内置函数处理这些类成员的方式。例如,len()
和{__len__()
和{
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()
对它进行排序:
有没有一种神奇的方法可以让sorted()
在元素不按顺序排列时翻转它们?我在想象以下行为:
>>> s = SetOfTwo(2, 1)
>>> str(s)
[2, 1]
>>> t = sorted(s)
>>> str(t)
[1, 2]
>>> type(t)
>>> SetOfTwo
len()
和str()
是以对象为参数并返回整数(resp。字符串)。对象可以通过__len__()
和__str__()
魔术方法个性化计算len或生成字符串的方式。在类似地,
sorted()
是一个接受对象列表(或任何iterable)并返回排序对象列表的函数。对象可以通过__lt__()
魔术方法对它们进行比较。在当我们把“sorted(my_list)看作是一个“对列表排序”的函数,而不是“对列表的元素进行排序”时,就会产生一些混淆。在
你不想对你的对象进行排序(例如,建立一个有序的对象列表),而只需对一些内部表示的数据进行排序。因此,您需要在对象上使用一个实例方法来更新该内部表示。您可以随意命名它,
.sort()
如果您愿意的话,但是您必须在您的一个对象上调用它,并且它不会涉及到对象的比较。在您应该阅读关于如何模拟容器类型的the official documentation。基本上,一个应该作为容器工作的类(list、dict等)需要实现方法来设置或获取成员},并获得项数-方法
__getitem__()
,__setitem__()
,并迭代项目{__len__()
。这是最低要求。但您也可以添加删除项和其他操作的功能。sorted()
内置函数的行为是迭代容器中的元素,并使用您提到的__cmp__(), __ge__(), __le__()
方法对它们进行比较,这些方法应该是为项目而不是容器定义的。然后创建一个新的list
实例,其中的项已排序,并返回这个新实例。然后可以将其传递给自定义容器的构造函数,也可以使用自定义函数wrapsorted()
,该函数将返回所需的类实例。在正如一些人在评论中所说,集合是无序的,但我不认为你的问题是关于集合的。在
Python使用您提到的数据模型方法,ge,le和cmp来确定在调用sorted()时类的行为。您可以看到我如何在这里调用它,但是Python对象并要求我实现<;。在
希望这有帮助。另外,正如其他人所说,在收藏.abc. 为了得到一个好主意,我阅读了《高效python中的第28条。在
相关问题 更多 >
编程相关推荐