在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}}以前没有分配过一个值(没有要打印的当前值)。
答案 0 :(得分:1)
您在self.x
中设置了__init__
(使用设置器)。但是在实际设置价值之前,x.setter
你print(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