为什么@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