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)

  

  

时间: 2025-01-31 00:47:46

python_如何让类支持比较运算?的相关文章

让ecshop模板支持php运算

让ecshop模板支持php运算在 cls_template.php 底部加入函数: /*** 处理math中的公式. * */ function get_math_para($val){ $pa= $this->str_trim($val); foreach($pa AS $value) { if(strrpos($value, '=')) { list($a, $b) = explode('=', str_replace(array(' ', '"', "'", '

Android开发调试日志工具类[支持保存到SD卡]

直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.UnknownHostException; import java.text.SimpleDateFormat; impor

如何禁止C++ 类支持拷贝

如何禁止C++ 类支持拷贝 C++ 编译器默默地为你做了不少工作 当你写下 class Empty {}; //其实等价于 class Empty { public: Empty() { ... } //default constructor Empty(const Empty &rhs) { ... } //copy constructor ~Empty() { ... } //destructor Empty& operator=(const Empty &rhs) { ...

全面掌握Mysql及select支持的运算操作

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45725317 花了2天时间整理了一下Mysql中的常用命令及select支持的运算操作,希望这篇博客对大家有所帮助. 内容提纲 1.登录mysql 2.查看mysql信息 3.查看所有数据库 4.打开指定数据库 5.李处指定数据库中的所有表 6.查看指定表的结构 7.查看建表语句 8.建库建表 9.修改指定表结构 10.查看数据库的编码方式 11.DML语句(CRUD)操作 12.注释方

java 遍历指定包名下所有的类(支持jar)

package com.shdl.htscada.utils; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import 

怎样禁止C++ 类支持拷贝

怎样禁止C++ 类支持拷贝 C++ 编译器默默地为你做了不少工作 当你写下 class Empty {}; //事实上等价于 class Empty { public: Empty() { ... } //default constructor Empty(const Empty &rhs) { ... } //copy constructor ~Empty() { ... } //destructor Empty& operator=(const Empty &rhs) { ..

python类与对象-如何让类支持比较操作

如何让类支持比较操作 问题举例 有时我们希望自定义类的实例间可以使用<, <=, >, >=, ==, !=符号进行比较,我们自定义比较的行为. 比如,有一个矩形,比较两个矩形的实例时,我们希望比较的是面积. 比如,有一个矩形和一个圆形,我们希望比较一个矩形实例和一个圆形实例, 我们希望它们比较的是面积. 解决思路 (1)比较运算符重载,需要实现以下方法 __lt__, __le__, __gt__, __ge__, __eq__, __ne__ (2)使用标准库functions

使类支持比较操作

Python的基础数据类型大多支持比较操作,如 >=, ==, <=等.类对象默认不支持对象间比较操作,除非实现相应的__le__, __eq__, __le__方法等. Python类可以通过为每个比较运算符实现一个特殊的方法来支持比较. 例如,要支持>=运算符,请在类中定义__ge __()方法. 尽管定义单个方法通常没有问题,但是创建每个可能的比较运算符的实现很快变得很繁琐. Python模块functools提供了total_ordering类装饰器方法,可用于简化此过程. 要使

遍历指定包名下所有的类(支持jar)(转)

支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClassLoader()获取ClassLoader实例将包名转为路径名后,做为参数传给CloassLoader.getResources(),以得到该路径下所有资源的URL;通过URL.getProtocol()方法,判断资源是在本地(file:)或是第三方jar包(jar:)内;在本地的类直接文件遍历即可;第三方jar则通过