更简单的python操作符重载方法?
我正在用Python开发一个图形库,我用以下方式定义我的vetex:更简单的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
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