为什么@var.setter 函数不能访问class 变量?
Why can't @var.setter function access class variables?
我有一个 class,我想在 属性 更改时验证数据。我希望将有效选项存储为 setter 可以引用的 class 变量,但我似乎发现 在 @var.setter
中选项 我 根本无法引用任何 class 变量。
这是为什么?
代码示例:
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'
当它明确时。
您是第一个设置variable1
__init__
:
def __init__(self):
self.variable1 = 1
self.variable2 = 2
由于 self.variable1
由 @variable1.setter
处理,variable2
当时还不存在。您可以 交换 两行:
def __init__(self):
self.variable2 = 2
self.variable1 = 1
现在 variable2
已在 variable1.setter
运行前正确设置。
或者,给 variable2
一个 class 属性作为默认属性:
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
,绕过setter:
class Standard():
def __init__(self):
self.__variable1 = 1 # don't use the setter
self.variable2 = 2
我有一个 class,我想在 属性 更改时验证数据。我希望将有效选项存储为 setter 可以引用的 class 变量,但我似乎发现 在 @var.setter
中选项 我 根本无法引用任何 class 变量。
这是为什么?
代码示例:
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'
当它明确时。
您是第一个设置variable1
__init__
:
def __init__(self):
self.variable1 = 1
self.variable2 = 2
由于 self.variable1
由 @variable1.setter
处理,variable2
当时还不存在。您可以 交换 两行:
def __init__(self):
self.variable2 = 2
self.variable1 = 1
现在 variable2
已在 variable1.setter
运行前正确设置。
或者,给 variable2
一个 class 属性作为默认属性:
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
,绕过setter:
class Standard():
def __init__(self):
self.__variable1 = 1 # don't use the setter
self.variable2 = 2