【问题标题】:Class objects contains both _<var> and <var> attributes when using property decorator使用属性装饰器时,类对象同时包含 _<var> 和 <var> 属性
【发布时间】:2021-11-07 11:14:00
【问题描述】:

我有以下课程。如果用户没有为此提供值,我想保留 _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作为属性?

【问题讨论】:

  • 你能澄清你在问什么吗?实例 x 没有 有一个属性 my_var - 它有一个属性。你怎么看属性?
  • 我使用 dir(x) 检查

标签: python oop properties python-decorators python-class


【解决方案1】:

这是因为你把my_var设为了一个属性,但是在函数中它返回了self._my_var,所以如果你把self._my_var改成10,然后你再调用my_var函数,它就会返回修改后的self._my_var 值。

my_var 函数设置为@property 可能会让您感到困惑,它的作用就像它只是类的属性,但它实际上是一个函数,只是在调用时不带括号。如果您将其设为不带@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)

【讨论】:

  • 这是为私有属性添加设置器的正确方法吗?命名转换是否正确。变量名称:_my_var,属性设置器名称:my_var()?
  • @Malintha 当然。这是典型的
  • @Malintha 是的,对此添加了更多解释。
猜你喜欢
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 2013-11-02
  • 2019-11-05
  • 2017-11-19
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多