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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Python入门学习之字符串与比较运算符
  • 实例说明Python中比较运算符的使用
(0)

相关推荐

  • 实例说明Python中比较运算符的使用

    下表列出了所有Python语言支持的比较操作符.假设变量a持有10和变量b持有20,则: 例如: 试试下面的例子就明白了所有的Python编程语言提供的比较操作符: #!/usr/bin/python a = 21 b = 10 c = 0 if ( a == b ): print "Line 1 - a is equal to b" else: print "Line 1 - a is not equal to b" if ( a != b ): print &q

  • Python入门学习之字符串与比较运算符

    Python字符串 字符串或串(String)是由数字.字母.下划线组成的一串字符. 一般记为 : s="a1a2···an"(n>=0) 它是编程语言中表示文本的数据类型. python的字串列表有2种取值顺序: 从左到右索引默认0开始的,最大范围是字符串长度少1 从右到左索引默认-1开始的,最大范围是字符串开头 如果你的实要取得一段子串的话,可以用到变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾. 比如:

  • python如何让类支持比较运算

    本文实例为大家分享了python类支持比较运算的具体代码,供大家参考,具体内容如下 案例: 有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为. 需求: 有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积 如何解决这个问题? 在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较 单个类比较 #!/usr/bin/python3 from math import pi class Circle(object): def __

  • 关于Python中定制类的比较运算实例

    Python中的比较运算有几种:小于.小于等于.等于.大于等于.大于.不等于等.如果我们的数据对象具有明确的物理含义,比如说数值是带有数字与物理单位的字符串组合,那么进行大小比较的时候就可以做此定制. 下面针对6种比较方法中的一种来进行定制示范,选择小于判断来做尝试. 写如下示范代码: class myClass: def __init__(self,value): self.value = value def __lt__(self,other): return int(self.value[

  • Python之变量类型和if判断方式

    Python基础 1.数据类型(举几个最常用的) 整数型(int),可以理解为不带小数点的数字,比如13,-456等 浮点型(float) ,带小数点的数字,比如456.13,-798.13等 字符串(string),用'',"",''' '''或者""" """包裹的任意文本,比如'132',"abc"等, 如果输入的文本中包括''或者""需要在前面加\转义,比如'i\'m ok'这样

  • Python如何执行精确的浮点数运算

    问题 你需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现. 解决方案 浮点数的一个普遍问题是它们并不能精确的表示十进制数. 并且,即使是最简单的数学运算也会产生小的误差,比如: >>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> (a + b) == 6.3 False >>> 这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行

  • 使用Python实现图像融合及加法运算

    目录 一.图像加法运算 1.Numpy库加法 2.OpenCV加法运算 二.图像融合 三.图像类型转换 一.图像加法运算 1.Numpy库加法 其运算方法是:目标图像 = 图像1 + 图像2,运算结果进行取模运算. 当像素值<=255时,结果为“图像1+图像2”,例如:120+48=168 当像素值>255时,结果为对255取模的结果,例如:(255+64)%255=64 2.OpenCV加法运算 另一种方法是直接调用OpenCV库实现图像加法运算,方法如下: 目标图像 = cv2.add(图

  • Python实现信用卡系统(支持购物、转账、存取钱)

    最近一直在做一个有关信用卡系统的项目,所有很少出来给大家打招呼了,今天也该告一段了,本项目是基于python编程语言做的,此信用卡支持购物,转账和存取钱,下面小编把需求及实现思路大概分享一下,仅供参考,如有bug欢迎各位大侠提出,共同学习进步,谢谢! 一.要求 二.思路 1.购物类buy 接收 信用卡类 的信用卡可用可用余额, 返回消费金额 2.信用卡(ATM)类 接收上次操作后,信用卡可用余额,总欠款,剩余欠款,存款 其中: 1.每种交易类型不单独处理金钱,也不单独记录流水账,每种交易类型调用

  • Python中Class类用法实例分析

    本文实例讲述了Python中Class类用法.分享给大家供大家参考,具体如下: 尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦.因此我们关注Python在FP上的优势的同时,还得了解一下Python在OO方面的特性. 要讨论Python的OO特性,了解Python中的Class自然是首当其冲了.在Python中定义class和创建对象实例都很简单,具体代码如下: class GrandPa: def __

  • python抽象基类用法实例分析

    本文实例讲述了python抽象基类用法.分享给大家供大家参考.具体如下: 定义抽象类,需要使用abc模块,该模块定义了一个元类(ABCMeata),和装饰器 @abstractmethod, @abstractproperty 如果要实例化继承了Foo 的子类,子类必须实现了Foo所有的抽象方法(跟java一样),否则实例化报错. 抽象类不能直接实例化 #!coding=utf-8 from abc import ABCMeta, abstractmethod, abstractproperty

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

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗,它的颜色,大小,年龄,体重等是它的属性或特征.它会汪汪叫,会摇尾巴等是它的行为. 我们在描述一个真实对象(物体)时包括两个方面: 它可以做什么(行为) 它是什么样的(属性或特征). 在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象

  • C#中math类的全部运算方法(总结)

    如下所示: Abs 返回指定数字的绝对值. Acos 返回余弦值为指定数字的角度. Asin 返回正弦值为指定数字的角度. Atan 返回正切值为指定数字的角度. Atan2 返回正切值为两个指定数字的商的角度. BigMul 生成两个 32 位数字的完整乘积. Ceiling 返回大于或等于指定数字的最小整数. Cos 返回指定角度的余弦值. Cosh 返回指定角度的双曲余弦值. DivRem 计算两个数字的商,并在输出参数中返回余数. Exp 返回 e 的指定次幂. Floor 返回小于或等

随机推荐