将“属性”应用于实例变量“ self.x”时,“超过最大递归深度”


问题内容

我正在阅读property(),据了解,属性访问通过property()中指定的方法进行。但是执行以下代码时,出现“
RuntimeError:超出最大递归深度”。

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

    def dellx(self):
        print "deleting"
        return 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

是否无法以这种方式应用属性。因为当’self.x’更改为self._x和self .__ x时,它工作正常。


问题答案:

该错误是由于以下无限递归循环:您已经定义的属性x与用途gettxsettx以及deltx访问方法,但访问方法自己尝试访问该属性x(即自称)。

您应该按照以下方式编写代码:

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")