网络编程
位置:首页>> 网络编程>> Python编程>> python如何让类支持比较运算

python如何让类支持比较运算

作者:北门吹雪  发布时间:2022-07-07 13:02:52 

标签:python,类,比较运算

本文实例为大家分享了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

0
投稿

猜你喜欢

  • 当你碰到下面的asp错误提示时,说明你asp运行脚本超时了!  Active   Serv
  • 你知道(X)HTML中最多余的标签中是什么吗?在我看来就是这个<a>标签,不错,就是每个网站使用最多的超级链接标签<a&g
  • 1,CSS,JS,IMG一个都不能少运行代码框<style  type="text/css">&l
  • 本文实例为大家分享了Python实现学生成绩管理系统的具体代码,供大家参考,具体内容如下基本功能:输入并存储学生的信息:通过输入学生的学号、
  • 用DIV+CSS可以作出很多不同形状的角形;以下我只写了几个;CSS没有优化;是为了让大家看得更清一些;以下是一些小三角的形状:这是第一个小
  • 在开发数据库应用中,经常会遇到处理时间的问题,如查询指定时间的记录等。下面就这些常见的问题,结合自己的一些经验,和大家探讨一下这类问题。首先
  • Google Chrome,又喜欢逛豆瓣,Google Chrome支持User Scripts了,但是我写的那几个插件在Chrome下又跑
  • 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHO
  • 使用环境:人才网项目中有一个简历保密设置,其中有一个过滤关键词,只有某个企业的公司名中包含有其中的一个关键字,就不显示该份简历,当然,我还没
  • python虚拟环境迁移:注意事项:直接将虚拟环境复制到另一台机器,直接执行是会有问题的。那么可以采用以下办法:思路:将机器1虚拟环境下的包
  • 外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:LEFT J
  • 今天看了一下数据结构的书,发现其实数据结构没有几种,线性表,数组,字符串,队列和栈,等等,其实是一回事,然后就是树结构,图结构。数据结构的理
  • 前言本文根据安前松的视频分享整理而来,视频回放地址如下:www.bilibili.com/video/BV1Hr&hellip;一、
  • 前言首先线程和线程池不管在哪个语言里面,理论都是通用的。对于开发来说,解决高并发问题离不开对多个线程处理。我们先从线程到线程池,从每个线程的
  • pyc的破解相对容易,使用cython将python文件编译成.so文件,能在一定程度上增强python源码的私密性。编译成.so文件环境准
  • 最近随着狂风计划的席卷,我也终于开始橱窗产品位列表展示的编码工作,这只是一个改进项目,因此有原代码可供参考。但是当我打开原代码模板的时候便愣
  • 在asp中获取当前的地址栏网址很简单,使用下面这句语句即能实现获取网站域名Request.ServerVariables("HTT
  • 匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内
  • 下面发一个简单的在线调试服务端js代码的asp源码。并可以提示代码具体错误信息。<%@language="javascrip
  • 使用本文提供的JavaScript脚本,配合Dreamweaver的层和行为的运用,可以在页面中显示可拖动的精美月历。具体制作步骤如下:1、
手机版 网络编程 asp之家 www.aspxhome.com