我有一个类,我想在更改属性时验证数据。我希望将有效的选项存储为设置器可以参考的类变量,但是我似乎在@var.setter
选项中发现我根本无法参考任何类变量。
为什么?
代码示例:
class Standard():
def __init__(self):
self.variable1 = 1
self.variable2 = 2
@property
def variable1(self):
# This works
print(self.variable2)
return self.__variable1
@variable1.setter
def variable1(self, var):
# This doesn't work
print(self.variable2)
self.__variable1 = var
x = Standard()
print(x.variable1)
x.variable1 = 4
print(x.variable1)
此输出:
AttributeError: 'Standard' object has no attribute 'variable2'
显然会。
您是 first 在__init__
中设置variable1
:
def __init__(self):
self.variable1 = 1
self.variable2 = 2
由于self.variable1
由@variable1.setter
处理,因此variable2
当时还不存在。您可以交换两行:
def __init__(self):
self.variable2 = 2
self.variable1 = 1
现在在variable1.setter
运行之前正确设置variable2
。
另外,给variable2
作为默认值的类属性:
class Standard():
# ...
variable2 = 'class default'
@variable1.setter
def variable1(self, var):
print(self.variable2)
self.__variable1 = var
或在self
上使用getattr()
:
@variable1.setter
def variable1(self, var):
print(getattr(self, 'variable2', 'not available yet'))
self.__variable1 = var
或直接设置__variable1
,绕过设置器:
class Standard():
def __init__(self):
self.__variable1 = 1 # don't use the setter
self.variable2 = 2