mk schrieb:
Hello everyone,

I try to set two properties, "value" and "square" in the following code, and arrange it in such way that setting one property also sets another one and vice versa. But the code seems to get Python into infinite loop:

 >>> import math
 >>> class Squared2(object):

    def __init__(self, val):
        self._internalval=val
        self.square=pow(self._internalval,2)
def fgetvalue(self):
        return self._internalval
def fsetvalue(self, val):
        self._internalval=val
        self.square=pow(self._internalval,2)
value = property(fgetvalue, fsetvalue)

    def fgetsquare(self):
        return self.square
    def fsetsquare(self,s):
        self.square = s
        self.value = math.sqrt(self.square)
square = property(fgetsquare, fsetsquare)

>>> a=Squared2(5)

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    a=Squared2(5)
  File "<pyshell#10>", line 5, in __init__
    self.square=pow(self._internalval,2)
  File "<pyshell#10>", line 19, in fsetsquare
    self.square = s
  File "<pyshell#10>", line 19, in fsetsquare
    self.square = s
  File "<pyshell#10>", line 19, in fsetsquare
    self.square = s
  File "<pyshell#10>", line 19, in fsetsquare
    self.square = s
  File "<pyshell#10>", line 19, in fsetsquare
    self.square = s
  File "<pyshell#10>", line 19, in fsetsquare

...

Is there a way to achieve this goal of two mutually setting properties?


Better to make the getter for square return the square of value, and the setter of square compute the root & set that. Like this:

class Squared2(object):

    def __init__(self, value):
        self.value = value


    @apply
    def squared():
        def fset(self, squared):
            self.value = math.sqrt(squared)

        def fget(self):
            return self.value ** 2

        return property(**locals())

Diez
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to