5

我正在阅读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 时,它运行良好。

4

2 回答 2

12

该错误是由于以下无限递归循环造成的:您已x使用gettxsettxdeltx访问方法定义了一个属性,但访问方法本身尝试访问该属性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")
于 2013-02-07T10:51:12.053 回答
0

根据python 文档

如果 c 是 C 的一个实例,cx 将调用 getter,cx = value 将调用 setter,del cx 将调用 deleter。

因此,您的代码行self.x = "Raj"本质上调用了 method settx(self, val)。在该方法中,该行self.x = val再次调用该settx(self, val)方法,该方法又再次调用settx(self, val). 因此,我们有一个无限循环。

因此,设置属性值的正确方法是self._x = value.

正确代码:

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

输出:

p.x getting x
Raj
Setting x
p.x: getting x
R
于 2017-09-06T19:27:32.823 回答