Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更简单的python操作符重载方法?_Python_Operator Overloading - Fatal编程技术网

更简单的python操作符重载方法?

更简单的python操作符重载方法?,python,operator-overloading,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(s

我正在用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
......
类顶点:
定义初始化(自、键、值):
self.\u key=key
自我价值=价值
@财产
def键(自):
返回self.\u键
@键设定器
def密钥(自我、新密钥):
self.\u key=newKey
@财产
def值(自身):
返回自我值
@价值设定者
def值(自身、新值):
self.value=newValue
定义测试一致性(自身、其他):
如果类型(自身)!=类型(其他):
引发异常(“此处需要两个顶点!”)
定义(自身、其他):
_测试一致性(其他)
如果self.index可以帮你解决这个问题。它是用来做班级装饰的。您可以定义
\uu lt\uuuuuu()
\uuuuuu()
\uuuu gt\uuuuuuu()
,或
\uuuu ge\uuuuuuuuuu()
\uuuuuuuuuuuq>中的一个,并填充其余部分

作为旁注:

而不是写这个

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

如果使用self.index,则只需定义一个相等运算符和一个排序运算符。在Python<3.2中,您运气不好,必须将这些操作符定义为单独的方法。尽管您可以自己编写一个更简单版本的
total\u ordering
来保存一些代码,但如果您在多个地方需要它的话。

为什么要使用这些属性?为什么不使用常规属性呢?嗯@delnan这个线程可能会帮助你我非常清楚
属性如何工作以及它为什么好。但是它仍然比仅仅使用一个属性(
self.key=…
\uuu init\uuu
中)至少多了六行。我认为delnan的观点是,您可以将
key
value
定义为常规属性(不需要
\uu
),然后您就不需要这些属性了。如果您决定需要一个属性,那么您可以调整代码,它仍然是向后兼容的。+1到delnan和mgilson的观点,定义getter和setter是非常糟糕的形式,即使使用属性装饰器,直到您真正需要它们。我必须导入任何东西才能使用它吗?我使用@total_排序时出错。谢谢你的回答。
return self.index <= other.index