【发布时间】:2017-09-03 17:50:42
【问题描述】:
我有以下课程。 self.value 和 self.name 的行为是相同的。只有变量名不同。我怎样才能重写它,这样我就不必仅仅因为我使用不同的变量名而定义两个本质上相同的属性定义?我可以访问 setter 和 getter 函数中的变量名并使用getattr() 和setattr()吗?
我正在使用:Jython 2.5.2
class StateMachineState(object):
def __init__(self, value, name):
self.valueHash = None
self.nameHash = None
self.stateHash = None
self.value = value
self.name = name
def __eq__(self, other):
return self.stateHash == other.stateHash if self.__class__ == other.__class__ else False
def __str__(self):
return "value = %s (%s) - name = %s (%s) - (%s)" % (self.value, self.valueHash, self.name, self.nameHash, self.stateHash)
def getValue(self):
return self._value
def setValue(self, value):
try:
str(value)
hash(value)
self.valueHash = hash(str(value) + str(value.__class__))
self._value = value
except:
self.valueHash = None
self._value = None
self.stateHash = hash(str(self.valueHash) + str(self.nameHash))
def getName(self):
return self._name
def setName(self, name):
try:
str(name)
hash(name)
self.nameHash = hash(str(name) + str(name.__class__))
self._name = name
except:
self.nameHash = None
self._name = None
self.stateHash = hash(str(self.valueHash) + str(self.nameHash))
value = property(getValue, setValue)
name = property(getName, setName)
【问题讨论】:
-
为什么你甚至拥有所有这些奇怪的机器?为什么不只使用两个普通的
value和name属性并将__hash__计算为hash((self.value, self.name))?当哈希可能发生冲突时,为什么要根据哈希值计算__eq__?为什么你的二传手会屏蔽所有错误?你只是在给自己制造问题。 -
因为我有不同的资源可以使用同一个类。每个源可以使用不同的数据类型(类)作为值和名称。只要它们可以被强制转换为 str 类型并且是可散列的,源就可以使用他们想要的任何值和名称类型。你是什么意思哈希可以碰撞?设置器将有某种错误报告。我只是没有把它放在这里,因为它与我的问题无关。
-
你刚才所说的都不是拥有所有这些奇怪机器的理由。至于哈希冲突,两个不应该被视为相等的对象可能很容易产生相同的哈希值。
-
对象的哈希值在它的类中是唯一的。我对
value和name值进行哈希处理,并包含类的 str() 值以保证唯一的哈希值。我拥有所有这些有线机器,因为要比较相等的状态,我将使用 stateHash 值。要搜索具有匹配值或名称的状态,我将使用 valueHash 和 nameHash 值进行搜索。感谢您的意见,但不要试图理解和纠正我的设计,而是请回答我的实际问题......我能够自己解决。 -
“对象的哈希值在它的类中是唯一的” - 首先是no, hash values are not unique, even within a class。其次,即使您使用的类的哈希值是保证是唯一的,带有
str值的第二层哈希仍然可能导致冲突。
标签: python jython python-2.5 jython-2.5