一、 引言

《第8.21节 Python中__lt__、gt__等 “富比较”(“rich comparison”)方法用途探究》《第8.22节 Python案例详解:重写 “富比较”方法控制比较逻辑》介绍了富比较方法及执行比较操作与富比较的对应关系,本节将通过案例分析排序操作与富比较方法的对应关系。

二、 案例说明

复用上节定义的类Car(如果你没看上节可以忽略这个背景,因为代码是完整的),包括实例属性和实例方法都保持不变,我们来(这4个方法的用途请见上一节《第8.21节 Python中__lt、__gt__等 “富比较”(“rich comparison”)方法用途探究》,然后我们定义多个实例变量放到一个列表中来进行排序,看执行效果。

为了分析,我们定义多个实例变量放到一个列表中,调用列表的排序方法sort来对列表进行排序,当然也可以调用sorted函数进行排序,二者大部分功能是一样的,但略有区别,在此就不展开讲了,老猿考虑开单章专门介绍。

三、 代码

>>> class Car():
def __init__(self,carname,oilcper100km, price):
self.carname,self.oilcper100km,self.price = carname,oilcper100km, price
def __lt__(self,other):
print("execute __lt__")
return self.price<other.price
def __le__(self,other):
print("execute __le__")
return self.price>other.price
def __gt__(self,other):
print("execute __gt__")
return self.oilcper100km>other.oilcper100km def __ge__(self,other):
print("execute __ge__")
return self.oilcper100km<other.oilcper100km def __repr__(self):
#return f"('{self.carname}',{self.oilcper100km},{self.price})"
return str(self.__dict__) >>> car1,car2,car3 = Car('爱丽舍',8,10),Car('凯美瑞',7,27),Car('科帕奇',12,23)
>>> cars=[car1,car2,car3]
>>> cars
[{'carname': '爱丽舍', 'oilcper100km': 8, 'price': 10}, {'carname': '凯美瑞', 'oilcper100km': 7, 'price': 27}, {'carname': '科帕奇', 'oilcper100km': 12, 'price': 23}]
>>> cars.sort()
execute __lt__
execute __lt__
execute __lt__
execute __lt__
>>> cars
[{'carname': '爱丽舍', 'oilcper100km': 8, 'price': 10}, {'carname': '科帕奇', 'oilcper100km': 12, 'price': 23}, {'carname': '凯美瑞', 'oilcper100km': 7, 'price': 27}]
>>>

四、 案例截屏



五、 案例分析

  1. sort排序时执行了四次__lt__方法调用,没有执行其他富比较方法,因此sort排序默认调用的富比较方法是__lt__方法;
  2. sort排序时改变了cars中的元素顺序,确保了列表中的元素是按__lt__方法指定的排序属性price进行排序的;
  3. 本节的__repr__方法实现代码与上节有所不同,这个应该是__repr__方法快速实现的一种方案,且符合Python对__repr__方法的要求。

本节参考资料:

1、《第8.21节 Python中__lt__、__gt__等 “富比较”(“rich comparison”)方法用途探究》

2、《第8.15节 Python重写自定义类的__repr__方法》

老猿Python,跟老猿学Python!

博客地址:https://blog.csdn.net/LaoYuanPython


请大家多多支持,点赞、评论和加关注!谢谢!

第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析的更多相关文章

  1. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  2. 第11.23节 Python 中re模块的搜索替换功能:sub及subn函数

    一. 引言 在<第11.3节 Python正则表达式搜索支持函数search.match.fullmatch.findall.finditer>重点介绍了几个搜索函数,除了搜索,re模块也 ...

  3. Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?

    在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...

  4. 第9.10节 Python中IO模块其他文件操作属性和方法简介

    本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...

  5. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  6. 第7.23节 Python使用property函数定义属性简化属性访问的代码实现

    第7.23节 Python使用property函数定义属性简化属性访问的代码实现 一.    背景       在本章前面章节中,我们介绍了类相关的知识,并举例进行了说明,在这些例子中会定义一些形如 ...

  7. python中的sort方法

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不 ...

  8. python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不 ...

  9. Python中的sort()

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...

随机推荐

  1. 分布式流平台Kafka

    提到Kafka很多人的第一印象就是它是一个消息系统,但Kafka发展至今,它的定位已远不止于此,而是一个分布式流处理平台.对于一个流处理平台通常具有三个关键能力: 1. 发布和订阅消息流,在这一点上它 ...

  2. JavaScript一元运算符、二元运算符和三元运算符

    在JavaScript中,运算符可以根据其实际操作数的个数进行分类. JavaScript中的大多数运算符是一个二元运算符(binary operator),将两个表达式合并成为一个稍复杂的表达式.譬 ...

  3. 使用配置文件方式记录Python程序日志

    开发者可以通过三种方式配置日志记录: 调用配置方法的Python代码显式创建记录器.处理程序和格式化程序. 创建日志配置文件并使用fileConfig() 函数读取. 创建配置信息字典并将其传递给di ...

  4. Ceph OSD从filestore 转换到 bluestore的方法

    前言 前段时间看到豪迈的公众号上提到了这个离线转换工具,最近看到群里有人问,找了下没什么相关文档,就自己写了一个,供参考 实践步骤 获取代码并安装 git clone https://github.c ...

  5. Dance Dance Revolution

    今天我们来讲 Dance Dance Revolution这题 本题原网址 注意本题为多组输入输出,直到输入单个零而止(题面有点小问题) 很明显,此题为一道动态规划题(请不要妄想用贪心算法过这题,尽管 ...

  6. pikachs 渗透测试2-XSS漏洞及利用

    一.概述 XSS(跨站脚本)概述 Cross-Site Scripting 简称为"CSS",为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS.一般XS ...

  7. xss攻击与防范

    xss攻击方式以及防范 通常来说,网站一般都是有着,用户注册,用户登录,实名认证等等这些需要用户把信息录入数据库的接口 xss找的就是这种接口,他们可以在传递数据的时候,传递恶意的  script  ...

  8. mongo命令行操作

  9. jQuery 第三章 CSS操作

    .css() .attr() .prop() .css() 参数填法:如下所示 ↓  可填px 可不填,注意点:background-color  这类属性,需要填成 小驼峰式  background ...

  10. docker提示容器已存在

    docker ps -a docker rm 容器id 重启启动