python如何让类支持比较运算
作者:北门吹雪 时间:2022-07-07 13:02:52
本文实例为大家分享了python类支持比较运算的具体代码,供大家参考,具体内容如下
案例:
有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为。
需求:
有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积
如何解决这个问题?
在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较
单个类比较
#!/usr/bin/python3
from math import pi
class Circle(object):
def __init__(self, radius):
self.radius = radius
def get_area(self):
return round(pow(self.radius, 2) * pi, 2)
# 重定义小于比较
def __lt__(self, other):
return self.get_area() < other.get_area()
# 重定义等于比较
def __eq__(self, other):
return self.get_area() == other.get_area()
if __name__ == '__main__':
c1 = Circle(3.0)
c2 = Circle(5.0)
print(c1 < c2) # c1.__le__(c2)
print(c1 == c2) # c1.__eq__(c2)
两个类比较
#!/usr/bin/python3
from math import pi
class Circle(object):
def __init__(self, radius):
self.radius = radius
def get_area(self):
return round(pow(self.radius, 2) * pi, 2)
# 重定义小于比较
def __lt__(self, other):
return self.get_area() < other.get_area()
# 重定义等于比较
def __eq__(self, other):
return self.get_area() == other.get_area()
if __name__ == '__main__':
c1 = Circle(3.0)
c2 = Circle(5.0)
print(c1 < c2) # c1.__le__(c2)
print(c1 == c2) # c1.__eq__(c2)
# !/usr/bin/python3
from math import pi
class Circle(object):
def __init__(self, radius):
self.radius = radius
def get_area(self):
return round(pow(self.radius, 2) * pi, 2)
# 重定义小于比较
def __lt__(self, other):
return self.get_area() < other.get_area()
# 重定义等于比较
def __eq__(self, other):
return self.get_area() == other.get_area()
class Rectangle(object):
def __init__(self, width, height):
self.width = width
self.height = height
def get_area(self):
return self.width * self.height
# 重定义小于比较
def __lt__(self, other):
return self.get_area() < other.get_area()
# 重定义等于比较
def __eq__(self, other):
return self.get_area() == other.get_area()
if __name__ == '__main__':
c1 = Circle(5.0)
R1 = Rectangle(4.0, 5.0)
print(c1 > R1) # c1.__le__(c2)
print(c1 == R1) # c1.__eq__(c2)
会出现一个问题,重复代码,如何解决?
通过functools下类的装饰器total_ordering进行比较
# !/usr/bin/python3
from math import pi
from abc import abstractmethod
from functools import total_ordering
@total_ordering
class Shape(object):
"""
定义一个抽象类,重定义比较运算,再定义抽象方法,然后子类通过这个方法进行比较,
其他子类比较类都需要重构抽象方法,实现比较运算
"""
# 标记比较方法,抽象方法
@abstractmethod
def get_area(self):
pass
# 重定义小于比较
def __lt__(self, other):
return self.get_area() < other.get_area()
# 重定义等于比较
def __eq__(self, other):
return self.get_area() == other.get_area()
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def get_area(self):
return round(pow(self.radius, 2) * pi, 2)
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def get_area(self):
return self.width * self.height
if __name__ == '__main__':
c1 = Circle(5.0)
R1 = Rectangle(4.0, 5.0)
print(c1 > R1) # c1.__le__(c2)
print(c1 == R1) # c1.__eq__(c2)
来源:http://www.cnblogs.com/2bjiujiu/p/7289251.html
标签:python,类,比较运算
0
投稿
猜你喜欢
利用python程序帮大家清理windows垃圾
2021-12-10 22:13:04
如何基于python把文字图片写入word文档
2021-04-20 06:48:49
Python动态规划实现虚拟机部署的算法思想
2022-12-13 05:02:47
asp连接MYSQL数据库的连接字符串(参数OPTION)
2009-03-09 18:24:00
python中查看变量内存地址的方法
2023-11-06 01:38:21
浅析php中array_map和array_walk的使用对比
2023-09-10 22:22:28
美之鉴 – 女人与Web设计
2009-12-09 15:36:00
Python QQBot库的QQ聊天机器人
2022-03-18 23:29:30
使用python处理题库表格并转化为word形式的实现
2023-07-25 12:33:18
详解git合并冲突解决方法
2023-05-11 05:18:34
解决Pytorch训练过程中loss不下降的问题
2023-03-01 09:30:22
python中字符串比较使用is、==和cmp()总结
2022-10-11 01:55:35
python进阶之多线程对同一个全局变量的处理方法
2023-09-29 19:03:58
小程序登录/注册页面设计的实现代码
2024-04-18 09:44:10
Python实现自定义读写分离代码实例
2023-04-19 14:34:57
mysql 索引使用及优化详情
2024-01-24 16:06:56
Python 20行简单实现有道在线翻译的详解
2022-02-12 22:19:29
Python提取Word中图片的实现步骤
2022-11-07 20:25:10
django中使用Celery 布式任务队列过程详解
2022-07-08 02:25:55
MySQL 索引详解
2010-01-20 09:39:00