Class 对象在使用 属性 装饰器时同时包含 _<var> 和 <var> 属性

Class objects contains both _<var> and <var> attributes when using property decorator

我有以下 class。如果用户没有为此提供值,我想保留 _my_var = None。他们可以使用 setter 来设置它,我在其中强制执行一些验证

class A:
  _my_var = None

  @property
  def my_var(self):
      return self._my_var
   
  @property.setter
  def my_var(self, value)
      # Some validation
      return._my_var = value

我在下面的代码中创建一个对象

x = A()

当我查看 x 的属性时

 _my_var: None
 my_var: None

当我设置 x._myvar = 10 时,my_var_my_var 属性都设置为 10。我对此感到困惑。 _my_var 是一个字段而 my_var 是一个函数吗?如何在强制设置 setter 的同时仅保留 _my_var 作为属性?

是因为你把my_var变成了属性,但是在函数里面return变成了self._my_var,所以如果你把self._my_var改成10,然后您再次调用 my_var 函数,它将 return 修改后的 self._my_var 值。

my_var 函数设置为 @property 可能会让您感到困惑,它的行为就像它只是 class 的属性一样,但它实际上是一个函数,只是调用时没有括号.如果你把它变成一个没有 @property 的常规函数​​,比如:

    def my_var(self):
        return self._my_var
  

那么它是一个函数会更明显,因为你会这样称呼它:

x._myvar = 10
print(x.my_var())

会给:

10

这样会更明显。

为了让它不根据_my_var改变,把函数改成一个变量,所以不是:

    def my_var(self):
        return self._my_var

成功:

    self.my_var = int(self._my_var)