I was reading property(), which I understand is attribute access goes through the method specified in property(). But I got \"RuntimeError: maximum recursion depth exceeded\
The error is due to the following infinite recursion loop: you have defined a property x
with uses the gettx
, settx
and deltx
access methods, but the access methods themselves try to access the property x
(i.e. call themselves).
You should write the code along the following lines:
class Property(object):
def __init__(self):
self.__x = "Raj" # Class private
def gettx(self):
print "getting x"
return self.__x
def settx(self, val):
print "Setting x"
self.__x = val
def dellx(self):
print "deleting"
return self.__x
x = property(gettx, settx, dellx, "I'm object property")
According to the python docs:
If c is an instance of C, c.x will invoke the getter, c.x = value will invoke the setter and del c.x the deleter.
So, your code line self.x = "Raj"
essentially calls the method settx(self, val)
. Within that method the line self.x = val
again calls the settx(self, val)
method which in turn again calls the settx(self, val)
. Thus, we have an infinite loop.
So, the correct way to set the value of the property is self._x = value
.
Correct code:
class Property(object):
def __init__(self):
self._x = 'Raj'
def gettx(self):
print "getting x"
return self._x
def settx(self, val):
print "Setting x"
self._x = val #stores the value in _x. writing self.x = val would cause an infinite loop
def dellx(self):
print "deleting"
del self._x
x = property(gettx, settx, dellx, "I'm object property")
p = Property()
print "p.x", p.x
p.x = "R"
print "p.x:", p.x
Output:
p.x getting x
Raj
Setting x
p.x: getting x
R