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
  • asp之家 网络编程 m.aspxhome.com