Python Rectangle类静态方法比较实例报>不支持错误解决方案
报错原因
Python自定义类默认不支持实例间直接使用>、<这类大小比较运算符——解释器不知道你要按什么维度(面积?周长?宽?高?)判断两个矩形的大小,自然会抛出TypeError: '>' not supported between instances of 'Rectangle' and 'Rectangle'的错误。
另外你原代码的比较逻辑还有两个隐藏问题:
- 参数校验顺序不合理,先校验
rect_2再校验rect_1不符合常规编码习惯 - 默认的
==运算符判断的是两个实例是否为内存中的同一个对象,不是面积/尺寸相等,哪怕两个矩形宽高完全一致,只要是分别初始化的不同实例,默认==判断都会返回False
修复方案
方案1:直接在静态方法中比较面积(最推荐,代码最简洁)
你已经在类中实现了计算面积的area()方法,直接调用该方法比较即可,不需要依赖运算符,修改后的静态方法代码如下:
@staticmethod def bigger_or_equal(rect_1, rect_2): if not isinstance(rect_1, Rectangle): raise TypeError("rect_1 must be an instance of Rectangle") if not isinstance(rect_2, Rectangle): raise TypeError("rect_2 must be an instance of Rectangle") # 面积相等时按需求返回rect_1 return rect_1 if rect_1.area() >= rect_2.area() else rect_2
方案2:实现类的比较运算符特殊方法
如果你确实需要直接用>、>=、==这类运算符比较两个Rectangle实例,可以给类实现对应的Python特殊方法(也叫魔法方法):
__gt__(self, other):定义>运算符的行为__ge__(self, other):定义>=运算符的行为__eq__(self, other):定义==运算符的行为
以实现>比较为例,在类中添加如下方法即可支持运算符直接比较:
def __gt__(self, other): if not isinstance(other, Rectangle): return NotImplemented return self.area() > other.area()
添加方法后你原来写的rect_1 > rect_2逻辑就可以正常运行,但对当前静态方法的场景来说,直接调用area()比较是维护成本最低、可读性最高的写法,不需要额外实现运算符方法。
内容的提问来源于stack exchange,提问作者Zebby
相关产品推荐
相关产品推荐

