一、 引言

《第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. Desition Tree附代码

  2. python数据分析01准备工作

    第1章 准备工作 1.1 本书的内容 本书讲的是利用Python进行数据控制.处理.整理.分析等方面的具体细节和基本要点.我的目标是介绍Python编程和用于数据处理的库和工具环境,掌握这些,可以让你 ...

  3. Hopfield Network 霍普菲尔德网络入门

    简介 Hopfield Network (霍普菲尔德网络),是 Hopfield 在1982年提出的一种基于能量的模型,发表的文章是 Neural networks and physical syst ...

  4. UNION 和 UNION ALL的区别,一个例子就看明白

    [UNION ALL] select a,b,sum(sm) AS s1, SUM(qm) AS s2 from ( select 'a' AS a, 'b' AS b, 2 AS sm, 200 A ...

  5. 《.NET 5.0 背锅案》第3集-剧情反转:EnyimMemcachedCore 无罪,.NET 5.0 继续背锅

    今天晚上基于第2集中改进版的 EnyimMemcachedCore 进行了发布,发布过程中故障重现,最大的嫌犯 EnyimMemcachedCore 被证明无罪,暂时委屈 .NET 5.0 继续背锅. ...

  6. read/write系统调用

    /*拷贝文件内容实例read系统调用.write系统调用ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, cons ...

  7. solr 笔记

    1.sorl其实是对存储的内容,根据相应的域和域的类型先分词,停顿,过滤(大小写转换)等等;然后建立多级索引.对搜索条件也是根据相应的域和域的类型进行分词,停顿,同义词,过滤(大小写转换)等等;然后建 ...

  8. Linux 升级内核开启 TCP BBR 有多大好处

    前言 如果你有订阅一些科技新闻,应该会有看过内核在4.9当中加入了一个新的算法,来解决在有一定的丢包率的情况下的带宽稳定的问题,这个是谷歌为我们带来的干货,新的 TCP 拥塞控制算法 BBR (Bot ...

  9. Python_爬虫项目

    1.爬虫--智联招聘信息搜集    原文链接 1 #-*- coding: utf-8 -*- 2 import re 3 import csv 4 import requests 5 from tq ...

  10. linux学习笔记全-如何学习linux?

    简介 今天整理文件整理出了好多年前学习linux的笔记 就整理下发布在博客上怕文件形式会误删. linux入门基础对于新手而言不推荐看书!!不推荐看书!!(大牛跳过)先看视频看linuxcast的视频 ...