更简单的方法来做python运算符重载?

时间:2013-01-10 19:20:01

标签: python operator-overloading

我正在使用Python中的图形库,我正在以这种方式定义我的vetex:

class Vertex:
def __init__(self,key,value):
    self._key = key
    self._value = value

@property
def key(self):
    return self._key

@key.setter
def key(self,newKey):
    self._key = newKey

@property
def value(self):
    return self._value

@value.setter
def value(self,newValue):
    self.value = newValue

def _testConsistency(self,other):
    if type(self) != type(other):
        raise Exception("Need two vertexes here!")

def __lt__(self,other):
    _testConsistency(other)
    if self.index <= other.index:
        return True
    return False
......

我真的必须自己定义__lt __,__ eq __,__ ne __。它太冗长了。有更简单的方法可以解决这个问题吗? 干杯。 请不要使用__cmp__,因为它将在python 3中消失。

2 个答案:

答案 0 :(得分:5)

functools.total_ordering可以帮到你。它意味着是一个类装饰器。您可以定义__lt__()__le__()__gt__()__ge__() AND __eq__中的一个,然后填写其余部分。

作为旁注:

而不是写这个

if self.index <= other.index:
    return True
return False

写下这个:

return self.index <= other.index

这样更干净。 : - )

答案 1 :(得分:2)

使用functools.total_ordering,您只需要定义一个相等运算符和一个排序运算符。在Python&lt; 3.2,你运气不好,某些东西必须将这些运算符定义为单独的方法。虽然您可以通过自己编写更简单的total_ordering版本来保存一些代码,但如果您需要在多个地方使用它。