在setter中访问属性的当前值

时间:2017-01-15 19:36:01

标签: python class properties setter

在Python中,是否可以访问其setter中的类变量的当前值

例如:

# Getter
@property
# ...

# Setter
@position.setter
def position(self, value):
    # Do something with current value...
    # self.position, self.__position, position and __position don't seem to work

    # Update position with the given value
    self.__position = value

    # Do something with the new value...

C#中的等价物是:

private Position position;

public Position Position
{
    get
    {
        // ...
    }

    set
    {
        // Do something with the current value...

        // Update position field with given object
        position = value;

        // Do something with the new value...
    }
}

更新
这是一个最小的,完整的,可验证的例子,可以更好地说明我的问题:

class C:
    def __init__(self):
        self.x = 2

    @property
    def x(self):
        return self.__x

    @x.setter
    def x(self, value):
        print(self.x)
        self.__x = value
        print(self.x)

c = C()

抛出以下错误:

AttributeError: 'C' object has no attribute '_C__x'

这是因为setter在更新之前尝试打印变量的当前值,并且当x__init__内设置为2时运行setter,此时x 1}}以前没有分配过一个值(没有要打印的当前值)。

1 个答案:

答案 0 :(得分:1)

您在self.x中设置了__init__(使用设置器)。但是在实际设置价值之前,x.setterprint(self.x)(使用吸气剂)。

您可以定义默认值(例如作为类属性)以使其工作:

class C:
    __x = None

    def __init__(self):
        self.x = 2

    @property
    def x(self):
        return self.__x

    @x.setter
    def x(self, value):
        print(self.x)
        self.__x = value
        print(self.x)

>>> c = C()
None
2

请注意,双重下划线变量受"name mangling"约束,而惯例是使用单个下划线变量。

另一种方法是try访问它,如果它不可用,则返回其他内容(或做其他事情):

class C:
    def __init__(self):
        self.x = 2

    @property
    def x(self):
        try:
            return self.__x
        except AttributeError:
            # I return "None" here but you could also do something else
            return None

    @x.setter
    def x(self, value):
        print(self.x)
        self.__x = value
        print(self.x)

产生相同的结果:

>>> c = C()
None
2