《第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排序会怎么处理?的更多相关文章

  1. Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?

    这是因为Python3中,str的输出是调用类的实例方法__str__来输出,如果__str__方法没有重写,则自动继承object类的__str__方法,而object类的__str__方法是调用_ ...

  2. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  3. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  4. Python中编写类的各种技巧和方法

    简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...

  5. 第8.16节 Python重写自定义类的__str__方法

    一. 引言 上节结合案例介绍了重写__repr__方法的关注点,重写__repr__方法的要点是要准确的输出开发人员关注的信息,并便于开发人员使用相关信息.而__str__方法是为最终用户返回类的相关 ...

  6. 第8.15节 Python重写自定义类的__repr__方法

    一. 引言 前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中, ...

  7. 全面了解python中的类,对象,方法,属性

    全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  8. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...

  9. 4、Python中的类详解(0601)

    <大话数据结构>的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/ 面向对象编程(OOP) 1.程序 = 指令 + 数据 代码可以选择以指令为核心或以数 ...

随机推荐

  1. Preparation for MCM/ICM Writing

    Preparation for MCM/ICM Writing -- by Chance Zhang $1^{st}ed$ key words: MCM/ICM, format, phrases, t ...

  2. TODO_LIST

    H5 blog: http://html5doctor.com/designing-a-blog-with-html5/ 绝尘单词本----H5+Web NIO+netty+RPC

  3. 绝对定位元素left、right、top、bottom值与其margin和宽高的关系

    绝对定位元素(position: absolute)在其相对定位元素(即文档流中最近的非静态定位祖先元素)中,定位祖先元素的宽度为W,垂直高度为H,则存在以下关系: 元素水平方向 width + le ...

  4. [MIT6.006] 6. AVL Trees, AVL Sort AVL树,AVL排序

    之前第5节课留了个疑问,是关于"时间t被安排进R"的时间复杂度能不能为Ο(log2n)?"和BST时间复杂度Ο(h)的关系.第6节对此继续了深入的探讨.首先我们知道BST ...

  5. GSO和TSO

    http://www.cnhalo.net/2016/09/13/linux-tcp-gso-tso/ TSO(TCP Segmentation Offload): 是一种利用网卡来对大数据包进行自动 ...

  6. 借助boost bind/function来实现基于对象编程。

    boost bind/function库的使用: 替换了stl中mem_fun,bind1st,bin2nd等函数.用户注册回调函数需要利用boost/bind转化成库中boost/function格 ...

  7. Flink处理函数实战之一:深入了解ProcessFunction的状态(Flink-1.10)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. 为什么关不掉所有的OSD

    前言 碰到一个cepher问了一个问题: 为什么我的OSD关闭到最后有92个OSD无法关闭,总共的OSD有300个左右 想起来在很久以前帮人处理过一次问题,当时环境是遇上了一个BUG,需要升级到新版本 ...

  9. 一个Wpf的开发框架

    引言 本框架使用Prism做MVVM,优点咱就不说了,主要了容器注入,消息和DI,比自己写省很多事.网上有很多标准的MVVM的使用方法,但是没有形成一个系统级的框架.本框架从登录到具体业务的使用,还有 ...

  10. sql bypass waf fuzz python

    从freebuf copy过来的,先保存,有空再改 #encoding=utf-8 import requests url = "http://127.0.0.1/index.php?id= ...