0

私は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__はPython3で使用できなくなるため、使用しないでください。

4

2 に答える 2

5

ここでfunctools.total_orderingが役立ちます。これは、クラス デコレータを意図しています。__lt__()__le__()__gt__()、または__ge__() AND のいずれかを定義する__eq__と、残りが埋められます。

補足として:

これを書く代わりに

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

これを書きます:

return self.index <= other.index

その方がすっきりします。:-)

于 2013-01-10T19:22:49.187 に答える
2

を使用functools.total_orderingすると、等値演算子の 1 つと順序付け演算子の 1 つを定義するだけで済みます。Python < 3.2 では運が悪く、これらの演算子を個別のメソッドとして定義する必要がありますtotal_orderingいくつかの場所で必要な場合は、より単純なバージョンの自分自身を作成することで、コードを節約できる場合があります。

于 2013-01-10T19:24:00.267 に答える