【问题标题】:Python (Jython) - can I access variable names in property setter and getter functions?Python (Jython) - 我可以在属性设置器和获取器函数中访问变量名吗?
【发布时间】:2017-09-03 17:50:42
【问题描述】:

我有以下课程。 self.valueself.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)

【问题讨论】:

  • 为什么你甚至拥有所有这些奇怪的机器?为什么不只使用两个普通的valuename 属性并将__hash__ 计算为hash((self.value, self.name))?当哈希可能发生冲突时,为什么要根据哈希值计算 __eq__?为什么你的二传手会屏蔽所有错误?你只是在给自己制造问题。
  • 因为我有不同的资源可以使用同一个类。每个源可以使用不同的数据类型(类)作为值和名称。只要它们可以被强制转换为 str 类型并且是可散列的,源就可以使用他们想要的任何值和名称类型。你是什​​么意思哈希可以碰撞?设置器将有某种错误报告。我只是没有把它放在这里,因为它与我的问题无关。
  • 你刚才所说的都不是拥有所有这些奇怪机器的理由。至于哈希冲突,两个不应该被视为相等的对象可能很容易产生相同的哈希值。
  • 对象的哈希值在它的类中是唯一的。我对 valuename 值进行哈希处理,并包含类的 str() 值以保证唯一的哈希值。我拥有所有这些有线机器,因为要比较相等的状态,我将使用 stateHash 值。要搜索具有匹配值或名称的状态,我将使用 valueHash 和 nameHash 值进行搜索。感谢您的意见,但不要试图理解和纠正我的设计,而是请回答我的实际问题......我能够自己解决。
  • “对象的哈希值在它的类中是唯一的” - 首先是no, hash values are not unique, even within a class。其次,即使您使用的类的哈希值保证是唯一的,带有str 值的第二层哈希仍然可能导致冲突。

标签: python jython python-2.5 jython-2.5


【解决方案1】:

我能够使用包装函数解决这个问题:

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 "( %s (%s) , '%s' (%s) ) - (%s)" % (self.value, self.valueHash, self.name, self.nameHash, self.stateHash)

    def getAttrValue(self, attrName):
        return getattr(self, '_' + attrName)

    def setAttrValue(self, attrName, value):
        valueName = '_%s' % attrName
        hashName = '%sHash' % attrName
        try:
            str(value)
            hash(value)
            setattr(self, hashName, hash(str(value) + str(value.__class__)))
            setattr(self, valueName, value)
        except:
            setattr(self, hashName, None)
            setattr(self, valueName, None)
        self.stateHash = hash((self.valueHash, self.nameHash))

    def getValue(self):
        return self.getAttrValue('value')

    def setValue(self, value):
        self.setAttrValue('value', value)

    def getName(self):
        return self.getAttrValue('name')

    def setName(self, name):
        self.setAttrValue('name', name)

value = property(getValue, setValue)
name = property(getName, setName)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2012-04-07
    • 2014-07-24
    • 2011-01-02
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多