即使在更新之后,Python类也在使用实例化的值

时间:2014-10-21 02:06:03

标签: python class

我正在运行以下代码:

class testClass:
    def __init__(self, left, width):
        self.__left = left
        self.__width = width

    @property
    def left(self):
        return self.__left

    @left.setter
    def left(self, newValue):
        self.__left = newValue

    @property
    def width(self):
        return self.__width

    @width.setter
    def width(self, newValue):
        self.__width = newValue

    def right(self):
        return self.__width + self.__left

    def rightFixed(self):
        return self.width + self.left

test = testClass(10,5)
test.left = 50
print test.right()
print test.rightFixed()

我得到了值

15
55

任何人都可以解释为什么第一个方法test.right()给出值15,而如果我调用test.rightFixed()值,它给出了适当的值?我已经查看了解释器,并且在代码运行后_testClass__left给了我10,而它应该给我50. @ left.setter属性似乎没有更新self .__ left,而是它似乎正在制作它自己的副本。

编辑:我还应该注意,我正在运行2.7.6。正如Games Brainiac指出的那样,这在python 3 +中运行良好。

2 个答案:

答案 0 :(得分:5)

(object)添加到您的班级。在Python 2.6之后,引入了一种新的数据模型。请参阅https://docs.python.org/2/reference/datamodel.html#newstyle

请参阅DSM的评论,了解Python3和Python2为何区别对待。

class testClass(object):
    def __init__(self, left, width):
        self.__left = left
        self.__width = width

    @property
    def left(self):
        return self.__left

    @left.setter
    def left(self, newValue):
        self.__left = newValue

    @property
    def width(self):
        return self.__width

    @width.setter
    def width(self, newValue):
        self.__width = newValue

    def right(self):
        return self.__width + self.__left

    def rightFixed(self):
        return self.width + self.left

>>test = testClass(10,5)
>>test.left = 50
>>print test.right()
55
>>print test.rightFixed()
55

答案 1 :(得分:0)

因为Python会'name-mangle'双倍下划线。如果必须使用双下划线,那么当您访问它们时,必须按如下方式进行:

test._testClass__left

但你应该只使用一个下划线,它表示一个私有变量,你可以继续正常。