Python中的total_ordering是一个装饰器函数,用于自动为类生成比较运算符方法。在这种情况下,只需要定义其中的一部分-例如__lt__和__eq__,另外的比较方法将自动从它们中推导出来。
要使用total_ordering,只需要在class定义前添加@functools.total_ordering装饰器,然后定义类中所需的比较方法__eq__, lt__等。 值得注意的是:Python将自动推导无法推导的方法(如__le__和__ge),以确保所有必需的比较方法都存在。
示例1
import functools
@functools.total_ordering
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
def __lt__(self, other):
return self.age < other.age
p1 = Person('Alice', 23)
p2 = Person('Bob', 25)
p3 = Person('Charlie', 23)
print(p1 == p2) # False
print(p1 != p2) # True
print(p1 < p2) # True
print(p3 == p1) # True
print(p3 >= p2) # False
在上面的示例中,我们定义了一个Person类,该类具有name和age属性。为了让类支持比较运算,我们使用了total_ordering装饰器,并定义了__eq__和__lt__方法。我们创建了三个Person对象p1,p2和p3,并使用了这些对象的各种比较。
示例2
import functools
@functools.total_ordering
class Fraction:
def __init__(self, num, denom):
self.num = num
self.denom = denom
def __eq__(self, other):
return self.num/self.denom == other.num/other.denom
def __lt__(self, other):
return self.num/self.denom < other.num/other.denom
f1 = Fraction(3, 4)
f2 = Fraction(1, 2)
f3 = Fraction(3, 8)
print(f1 == f2) # False
print(f1 != f2) # True
print(f1 < f2) # False
print(f1 >= f2) # True
print(f3 < f1) # True
在上面的示例中,我们定义了一个Fraction类,该类表示分数,具有num和denom属性。类中的__eq__和__lt__方法定义了如何比较两个Fraction对象。我们创建了三个Fraction对象f1,f2和f3,并使用了这些对象的各种比较。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python total_ordering定义类 - Python技术站