第8.22节 Python案例详解:重写 “富比较”方法控制比较逻辑
2023-09-27 14:26:59 时间
一、 案例说明
本节定义一个小汽车的类Car,类中包括车名carname、百公里油耗oilcostper100km、价格price三个属性。然后实现__lt__、__gt__、__le__、__ge__
四个方法(这4个方法的用途请见上一节《第8.21节 Python中__lt__、__gt__等 “富比较”(“rich comparison”)方法用途探究》(https://blog.csdn.net/LaoYuanPython/article/details/95042104),为了说明问题,我们将__lt__与__le__的比较逻辑以及__gt__与__ge__的比较逻辑故意弄成了相反,同时重写了__repr__方法以输出格式化的详细信息。然后我们定义两个实例变量来进行大小比较,看执行效果。
二、 案例代码
>>> class Car():
def __init__(self,carname,oilcostper100km, price):
self.carname,self.oilcostper100km,self.price = carname,oilcostper100km, 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.oilcostper100km>other.oilcostper100km
def __ge__(self,other):
print("execute __ge__")
return self.oilcostper100km<other.oilcostper100km
def __repr__(self): #重写__repr__方法输出repr信息
return f"('{self.carname}',{self.oilcostper100km},{self.price})"
>>> car1,car2 = Car('爱丽舍',8,10),Car('凯美瑞',7,27)
>>> car1<car2,car1<=car2,car1>car2,car1>=car2
execute __lt__
execute __le__
execute __gt__
execute __ge__
(True, False, True, False)
>>>
三、 案例截屏
四、 案例分析
- 通过4个比较的输出信息可以得知,<、<=、>、>=分别调用了
__lt__、__le__、__gt__、__ge__
四个方法; - 由于
__lt__、__le__
使用price进行比较,且真正的比较表达式是相反的两个逻辑,所以二者输出结果也完全相反,同理__gt__、__ge__也是一样,这说明Python自定义类的实例对象比较大小时,对象的大小判断规则是由开发者自己定义的,并没有要求“小于等于”就一定要包含“小于”,二者之间在实现时没有逻辑关系,__gt__与__ge__也如此,同理__gt__与__lt__也无需是相反的结果,最终的逻辑应该根据业务需要进行重写确认; - 通过以上案例,我们也知道,通过重写富比较方法,我们完全可以截获对象比较逻辑的调用;
- 实际的富比较方法还有__eq__和__ne__,这两个方法object类实现了,可以直接继承使用,但也可以重写。
本节参考资料:
1、《第8.21节 Python中__lt__、__gt__等 “富比较”(“rich comparison”)方法用途探究》;
2、《第8.15节 Python重写自定义类的__repr__方法》
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
相关文章
- Python实现简单HTTP服务器
- Pycharm Python 项目封装为 exe
- 利用Python实现 队列的算法
- python开发milvus2.0.2开发,快速上手,参考文档、手册、案例
- 【华为OD机试真题 python】整理扑克牌【2022 Q4 | 100分】
- Google Earth Engine(python)——简化版的快速接入GEE的API(含案例分析)
- Google Earth Engine(GEE)——Python干旱严重程度案例分析
- python中几种类型装饰器的使用案例
- 147 python网络编程 - UDP案例
- 81 python - 打飞机案例(源码)
- 76 python - 打飞机案例(显示敌机)
- 74 python - 打飞机案例(显示控制玩具飞机-面向对象)
- python & shell实现业务高峰期临时动态增加服务器
- 【Python】文件转码/编码/解码/utf8
- 聊聊Python中的is和==
- Python数据分析挖掘案例:Python爬虫助力疫情数据追踪
- Python(在Win10同时安装Python3和Python2)
- python模块之HTMLParser之穆雪峰的案例(理解其用法原理)
- python 面向对象编程案例01
- 【21天学习经典算法】折半查找与折半插入排序(附Python完整代码)
- python属性管理(1):基础
- 学习Python语言有什么用?
- python字符串拼接N种姿势
- Python基础入门-while循环示例
- 《Python自动化运维:技术与最佳实践》一1.1 系统性能信息模块psutil
- python基础技巧综合训练题1
- Python 值传递和引用传递
- 机器学习完整过程案例分布解析,python代码解析
- python第十四课--排序及自定义函数之自定义函数(案例三)
- python第十四课--排序及自定义函数之案例二:冒泡排序
- 【python养成】:案例(判断素数、统计字符串中的大写字母、小写字母、数字、其他字符的个数、整数之和、模拟内置函数)
- 【python养成】:案例练习(判断闰年、删除奇数、偶数降序排序、因式分解、100以内奇数之和、1234组成的素数、分段函数计算、100以内的所有丑数)
- Python实战案例分享:爬取当当网商品数据
- Python安装demjson模块报错:error in demjson setup command: use_2to3 is invalid