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
还有__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)
sorted()如果元素不按顺序排列,我可以实现一种神奇的方法来翻转元素吗?我正在想象以下行为:
>>> s = SetOfTwo(2, 1)
>>> str(s)
[2, 1]
>>> t = sorted(s)
>>> str(t)
[1, 2]
>>> type(t)
>>> SetOfTwo
您绝对应该阅读有关如何模拟容器类型的官方文档。基本上,一个应该作为容器(列表、字典等)工作的类需要实现方法来设置或获取成员__getitem__(),__setitem__()并迭代项目__iter__()并获取项目数量 - 方法__len__()。这是最小值。但您还可以添加删除项目和其他操作的功能。
内置函数的行为sorted()是迭代容器的元素并使用您提到的方法对它们进行比较,__cmp__(), __ge__(), __le__()这些方法应该为项目而不是您已经知道的容器定义。然后创建一个新list实例,其中项目已排序,并返回该新实例。然后您可以将其传递给自定义容器的构造函数,或者您可以sorted()使用自定义函数进行包装,该函数将返回所需的类实例。
| 归档时间: | 
 | 
| 查看次数: | 8751 次 | 
| 最近记录: |