【发布时间】:2021-08-18 18:08:04
【问题描述】:
我有一个这样的 Python 类:
@dataclass
class Person:
name: str
relatives: Iterable['Person']
我想对所有比较使用name 属性,以便Person 对象默认按字母顺序排序。因此,我像这样覆盖__gt__() 方法(如the documentation 中所述):
def __gt__(self, other):
return self.name > other.name
这实际上解决了我的初始任务,我可以这样做:
p1=Person("test1", relatives=[])
p2=Person("test2", relatives=[])
sorted([p1, p2])
Out[4]: [Person(name='test1', relatives=[]), Person(name='test2', relatives=[])]
还有这个:
p1>p2
Out[5]: False
p1<p2
Out[6]: True
我明白我不必实现所有运算符:
__lt__() 和 __gt__() 是彼此的反射,__le__() 和 __ge__() 是彼此的反射,__eq__() 和 __ne__() 是自己的反射。
但是,对于相等比较,我仍然必须明确覆盖 __eq__(other):
def __eq__(self, other):
return isinstance(other, Person) and self.name == other.name
有没有办法以更简洁的方式实现这一点?我想用某种方式告诉解释器“使用属性name 进行所有比较!”。
【问题讨论】:
标签: python oop operator-overloading comparator