Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?
在《第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析》中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用__lt__方法来进行排序比较,如果类中没有定义__lt__方法Python会怎么处理?
我们直接看案例:
一、	案例说明
本文案例直接在《第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析》基础上通过两个三引号注释掉__lt__方法的定义,然后定义实例列表进行排序。
二、	案例代码
>>> 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.sort()
execute __gt__
execute __gt__
execute __gt__
>>> cars
[{'carname': '凯美瑞', 'oilcper100km': 7, 'price': 27}, {'carname': '爱丽舍', 'oilcper100km': 8, 'price': 10}, {'carname': '科帕奇', 'oilcper100km': 12, 'price': 23}]
>>>
三、	案例截图

四、	案例分析
从上述案例可以看到,注释掉__lt__方法后,在未指定key参数的情况下Python排序方法调用了__gt__方法,并按__gt__方法比较大小的模式实现了数据排序,其实这与《Python的富比较方法__lt__、__gt__之间的关联关系分析》是一致的。
最后,如果__gt__方法也没有定义会怎么样?在此就不深入介绍,根据老猿的验证,如果__lt__和__gt__方法都没定义,其他富比较方法实现了,Python无法执行排序操作,会报异常:TypeError: ‘<’ not supported between instances of XX and XX。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?的更多相关文章
- Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?
		
这是因为Python3中,str的输出是调用类的实例方法__str__来输出,如果__str__方法没有重写,则自动继承object类的__str__方法,而object类的__str__方法是调用_ ...
 - python中的类,对象,方法,属性等介绍
		
注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
 - python中自定义类对象json字符串化的方法
		
1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...
 - Python中编写类的各种技巧和方法
		
简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...
 - 第8.16节  Python重写自定义类的__str__方法
		
一. 引言 上节结合案例介绍了重写__repr__方法的关注点,重写__repr__方法的要点是要准确的输出开发人员关注的信息,并便于开发人员使用相关信息.而__str__方法是为最终用户返回类的相关 ...
 - 第8.15节  Python重写自定义类的__repr__方法
		
一. 引言 前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中, ...
 - 全面了解python中的类,对象,方法,属性
		
全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
 - 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
		
一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...
 - 4、Python中的类详解(0601)
		
<大话数据结构>的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/ 面向对象编程(OOP) 1.程序 = 指令 + 数据 代码可以选择以指令为核心或以数 ...
 
随机推荐
- 09线程隔离的g对象
			
1,g是global的意思. g对象再一次请求中的所有的代码的地方,都是可以使用的. 同一次请求,那么在这个项目的所有地方都可以用了. from flask import Flask,request, ...
 - linux常用命令-查看cpu、内存、磁盘和目录空间
			
1. 查看磁盘空间: df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 40G 4.5G 33G ...
 - 378. Kth Smallest Element in a Sorted Matrix(大顶堆、小顶堆)
			
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
 - mysql开发常用技巧总结
			
1.查询某个schema,某张表的创建时间. SELECT CREATE_TIME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db_camp ...
 - AQS详解,并发编程的半壁江山
			
千呼万唤始出来,终于写到AQS这个一章了,其实为了写这一章,前面也是做了很多的铺垫,比如之前的 深度理解volatile关键字 线程之间的协作(等待通知模式) JUC 常用4大并发工具类 CAS 原子 ...
 - Centos7下Jewel版本radosgw服务启动
			
前言 本篇介绍了centos7下jewel版本的radosgw配置,这里的配置是指将服务能够正常起来,不涉及到S3的配置,以及其他的更多的配置,radosgw后面的gw就是gateway的意思,也就是 ...
 - Python 自定义模块位置
			
1.需要找出Python解释器从哪里查找模块: 具体方法: >>> import sys,pprint>>> pprint.pprint(sys.path)['', ...
 - mysql 5.7添加server_audit 安全审计功能
			
mysql 5.7添加server_audit 安全审计功能 一.根据链接下载插件 参考链接下载 http://blog.itpub.net/31441024/viewspace-2213103 l ...
 - Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现
			
0x00 漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...
 - 探究:nuget工具对不再使用的dll文件的处理策略
			
背景介绍 nuget是.net平台有效的包管理工具,相信每个C#开发者对它都不陌生. 本文我们来探究一下nuget对不再使用的dll文件的处理策略,分为如下2个场景: 场景A:包A1.0原来包含New ...