Python (Jython) - can I access variable names in property setter and getter functions?

255 Views Asked by At

I have the following class. The behavior for self.value and self.name are identical. Only the variable names are different. How can I rewrite this so that I don't have to define two essentially identical property definitions just because I'm working with different variable names? Can I access the variable names in the setter and getter functions and maybe use getattr() and setattr()?

I'm using: 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)
1

There are 1 best solutions below

0
On

I was able to solve this problem using a wrapper function:

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)