python 7-5 如何让类支持比较操作lt/le/total_ordering可以简化此过程,实现lt eq 后,可以推测出<= >=方法
2017-01-28 16:35
951 查看
python 7-5 如何让类支持比较操作
解决方案
第一种方案实现如下方案
比较符号运算符重载,要实现以下方法
lt
le
gt
ge
eq
ne
第二种方案
使用标准库中的functools下的类装饰器total_ordering可以简化此过程,
实现lt eq 后,total_ordering可以推测出<= >=方法
def lt(self,rect):
return self.area() < rect.area()
为了可以比较不同对象,我们可以将不同对象都继承一个类,在类中给出一个抽象函数,让需要参与的比较对象实现
解决方案
第一种方案实现如下方案
比较符号运算符重载,要实现以下方法
lt
le
gt
ge
eq
ne
第二种方案
使用标准库中的functools下的类装饰器total_ordering可以简化此过程,
实现lt eq 后,total_ordering可以推测出<= >=方法
def lt(self,rect):
return self.area() < rect.area()
def __eq__(self,rect): return self.area() == rect.area()
为了可以比较不同对象,我们可以将不同对象都继承一个类,在类中给出一个抽象函数,让需要参与的比较对象实现
解决方案1:
class Rectangle(object): def __init__(self,w,h): self.w = w self.h = h def area(self): return self.w * self.h def __lt__(self,rect): if self.area() < rect.area(): return True else: return False def __le__(self,rect): if self.area() <= rect.area(): return True else: return False def __gt__(self,rect): if self.area() > rect.area(): return True else: return False def __eq__(self,rect): if self.area() == rect.area(): return True else: return False def __ne__(self,rect): if self.area() != rect.area(): return True else: return False rect1 = Rectangle(1.0,2.0) rect2 = Rectangle(1.0,1.0) print rect1 < rect2
解决方案2:
from functools import total_ordering
@total_ordering
class Rectangle2(object):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
def __lt__(self,rect):
return self.area() < rect.area()
def __eq__(self,rect): return self.area() == rect.area()
rect1 = Rectangle(1.0,2.0)
rect2 = Rectangle(1.0,1.0)
print rect1 >= rect2
from abc import ABCMeta,abstractmethod
class Shape(object):
@abstractmethod
def area(self):
pass
def __lt__(self,obj):
if not isinstance(obj,Shape):
return TypeError('obj is not Shape')
return self.area() < obj.area()
def __eq__(self,obj):
if not isinstance(obj,Shape):
return TypeError('obj is not Shape')
return self.area() == obj.area()
class Rentangle3(Shape):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
class Circle(Shape):
def __init__(self,r):
self.r = r
def area(self):
from math import pi
return self.r**2*pi
r1=Rentangle3(2,2)
c1=Circle(3)
print r1 > c1
相关文章推荐
- CSS实现垂直居中的常用方法 在前端开发过程中,盒子居中是常常用到的。其中 ,居中又可以分为水平居中和垂直居中。水平居中是比较容易的,直接设置元素的margin: 0 auto就可以实现。但是垂直
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- Python之Fabric模块 Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- 一起谈.NET技术,数组排序方法的性能比较(中):Array.Sort<T> 实现分析
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- 探究 List<T> 集合的Where方法是如何实现的
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- Python抓取页面中超链接(URL)的三中方法比较(HTMLParser、pyquery、正则表达式) <转>
- myBatis 实现用户表增删查改操作<方法2 加入接口>(最终版)
- 【转载】Python中如何高效实现两个字典合并,三种方法比较。
- Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
- “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而<ModificationFunctionMapping>元素中没有支持当前操作的<InsertFunction>元素”问题的解决方法
- 艾伟_转载:数组排序方法的性能比较(中):Array.Sort<T> 实现分析
- java servlet 几种页面跳转的方法,需要的朋友可以参考一下 在访问网页的过程中,页面自动刷新、跳转和重定向是经常用到的,这里就说说在Java中是如何实现这些功能的! 一、页面自动刷新
- myBatis 实现用户表增删查改操作<方法1 没有使用接口的>(最终版)
- Python3中替代Python2中cmp()函数的新函数(gt,ge,eq,le,lt)
- 数组排序方法的性能比较(2):Array.Sort<T>实现分析