我知道python中有一些神奇的方法可以被类覆盖,以控制某些内置函数处理这些类成员的方式。例如,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()
对其进行排序:
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
len()
和str()
是将对象作为参数并返回整数(分别为字符串)的函数。对象可以通过__len__()
和__str__()
魔术方法来个性化len的计算方式或字符串的生成方式。
类似地,sorted()
是一个函数,它获取对象列表(或任何iterable)并返回已排序对象的列表。对象可以通过\uu lt\uuu()
魔术方法对它们进行比较的方式进行个性化设置。
当我们把`排序(my_list)`看作是一个“对列表排序”的函数,而不是“对列表中的元素排序”时,就会产生一些混淆。
您不希望对对象进行排序(即,创建对象的有序列表),而只对其内部表示形式中的某些数据进行排序。因此,您需要在对象上使用一个实例方法来更新该内部表示。您可以随意命名,。sort()
如果您愿意,但是您必须在一个对象上调用它,并且它不会参与比较对象。
正如一些人在评论中所说,集合是无序的,但我不认为你的问题是关于集合的。
Python使用您提到的数据模型方法ge、le和cmp来确定调用sorted()时类的行为。您可以看到我是如何尝试在这里调用它的,但是Python对象并要求我实现它
>>> class a(object):
... pass
...
>>> b = a()
>>> c = a()
>>> d = [b, c]
>>> sorted(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'a' and 'a'
希望这有帮助。另外,正如其他人所说,在集合中对某些内容进行子类化是一个好主意。美国广播公司。我阅读了有效python中的第28项,其中谈到了这一点,以获得一个好的想法。
您肯定应该阅读关于如何模拟容器类型的官方文档。基本上,假定用作容器的类(列表、dict等)需要实现方法来设置或获取成员\uuu getitem\uuuuuuuu()
,\uuuuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
,并迭代项\uuuuuuuuuuuuuuuuuuuuuuuuuuuu()
。这是最低限度。但您也可以添加删除项目和其他操作的功能。
sorted()
内置函数的行为是迭代容器的元素,并使用您提到的方法进行比较__cmpge__(), __le__()
应该为项而不是容器定义已经。然后创建一个新的list
实例,对项目进行排序,并返回这个新实例。然后,您可以将其传递给自定义容器的构造函数,或者您可以使用自定义函数wriapsorted()
返回所需的类实例。
如何使用类的对象调用函数?
本文向大家介绍python的sorted用法详解,包括了python的sorted用法详解的使用技巧和注意事项,需要的朋友参考一下 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的。 排序,数字、字符串按照ASCII,中文按照unicode从小到大排序 如果需要一个排序好的副本,同时保持原有列表不变,怎么实现呢? 注意:y
紫色透露着诡异的气息,所以能制造奇幻的效果。各种彩度与亮度的紫色,配上橘色和绿色,便是刺激与新奇的最佳代言人。如果紫色配上黄绿色或黄橘色,色调不合、怪异,而且俗不可耐,但如果配上它真正的补色——黄色,便能展现怪诞、诡异的感觉,令人不禁要驻足,欣赏一番。 以现代流行语来说,紫色象征“青涩”或“未成年”,常被用以代表两代关系之间的沟通桥梁。 补色色彩组合 二次色色彩组合 单色色彩组合 40 87 36
我有一个问题,我在测试中也找不到答案。方法pos和neg对我不起作用。 假设我们有一个简单的类: 现在,我想重写magic方法,它在我做语句时被调用: 如果是c: 但我不知道是哪个?请给我一些建议。
本文向大家介绍详解PHP神奇又有用的Trait,包括了详解PHP神奇又有用的Trait的使用技巧和注意事项,需要的朋友参考一下 php和java,c++一样都是单继承模式。但是像python,是支持多继承(即Mixin模式)。那么如何在php中实现多继承模式?这就需要使用trait。 Trait使用场景 有些功能不需要类的方法属性,但是在不同的类都有使用需求。例如上面的对象转数组方法。这种情况可以
神奇的错误,远程ecs可以连接,本地centos7连接不上, 检查了ssh以及端口是否开放,ping和联网也正常,密码也重置了,就是连接不上,这xshell还能要吗? 发现是好像是防火墙问题?但我明明开放了端口,但主机就连接端口显示失败?