zoukankan      html  css  js  c++  java
  • python类与对象-如何让类支持比较操作

    如何让类支持比较操作

    问题举例

    有时我们希望自定义类的实例间可以使用<, <=, >, >=, ==, !=符号进行比较,我们自定义比较的行为。

    比如,有一个矩形,比较两个矩形的实例时,我们希望比较的是面积。

    比如,有一个矩形和一个圆形,我们希望比较一个矩形实例和一个圆形实例,

    我们希望它们比较的是面积。

    解决思路

    (1)比较运算符重载,需要实现以下方法

    __lt__, __le__, __gt__, __ge__, __eq__, __ne__

    (2)使用标准库functions下的装饰器,total_ordering可以简化此过程。

    代码

    from functools import total_ordering
    
    from abc import ABCMeta, abstractclassmethod
    
    @total_ordering
    class Shape(metaclass=ABCMeta):
        @abstractclassmethod
        def area(self):
            pass
    
        def __lt__(self, obj):
            print('__lt__', self, obj)
            return self.area() < obj.area()
    
        def __eq__(self, obj):
            return self.area() == obj.area()
    
    class Rect(Shape):
        def __init__(self, w, h):
            self.w = w
            self.h = h
    
        def area(self):
            return self.w * self.h
    
        def __str__(self):
            return 'Rect:(%s, %s)' % (self.w, self.h)
    
    import math
    class Circle(Shape):
        def __init__(self, r):
            self.r = r
    
        def area(self):
            return self.r ** 2 * math.pi
    
    
    rect1 = Rect(6, 9) # 54
    rect2 = Rect(7, 8) # 56
    c = Circle(8)
    
    print(rect1 < c)
    print(c > rect2)

    参考资料:python3实用编程技巧进阶

  • 相关阅读:
    链路的有效性检测 及 基于TCP的通信为什么需要RETRY
    python join
    协程
    python socket 选项
    Spring @Resource、@Autowired、@Qualifier的区别
    maven插件
    代码中的特殊注释
    AOP 底层技术比较
    关于Android开发中的证书和密钥等问题
    tomcat部署web项目的3中方法
  • 原文地址:https://www.cnblogs.com/marton/p/10793247.html
Copyright © 2011-2022 走看看