【发布时间】:2018-07-29 19:26:11
【问题描述】:
我知道 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
【问题讨论】:
-
集合本质上是无序的。见this question。至于您的实际问题(除了命名法),只需在类上定义您自己的排序方法并使用它。或者传入一个 lamda。
-
@JaredSmith 我不认为这个问题真的是关于集合的。
-
你可以试试 OrderedSet
-
我很抱歉在我的玩具示例中使用了固有的无序集合。希望关于 python 中是否存在 sorted() 的魔术方法的问题仍然很清楚。
-
Python 的
sorted()函数接受一个可迭代对象并返回一个列表。因此,如果您的集合支持迭代,则可以将其传递给sorted()。元素的排序基于它们的自然排序或传递给sorted()的键函数。你会得到一个列表,而不是你的自定义类型。
标签: python oop magic-methods