为什么 @var.setter 函数无法访问类变量?



我有一个类,我想在更改属性时验证数据。我希望将有效的选项存储为设置器可以参考的类变量,但是我似乎在@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

最新更新