【问题标题】:How do change class attributes individually?如何单独更改类属性?
【发布时间】:2018-03-01 14:34:24
【问题描述】:

我读过一些关于 getter 和 setter 的文章,但还没有完全弄清楚。我的问题之一是 init 方法中的声明:如果该方法需要参数,我如何只更改一个属性?当然也欢迎任何其他方法。

class States:
    def __init__(self, f=0, n=0):
        self.state = n
        self.level_state = f

    @property
    def state(self, n):
        return self._state

    @state.setter
    def state(self, n):
        self._state = n

    @property
    def level_state(self, f):
        return self._level_state

    @level_state.setter
    def state(self, f):
        self._level_state = f

示例情况,单独更改属性:

情况1:

States().state = 3

情况2:

States().level_state = 2

【问题讨论】:

  • 您将下划线前缀的私有字段与非下划线前缀的getter和setter方法混合在一起。在所有方法中,使用字段。
  • 也不要在 getter 中赋值。请阅读 python 属性
  • 您的示例没有意义,因为您修改了立即符合垃圾回收条件的匿名对象。 s = States(); s.state = 3,但你为什么不直接写s = States(n=3)
  • 抱歉代码很尴尬,我修正了一些明显的疏忽。
  • 我仍然不确定如何单独修改两个不同的属性

标签: python python-3.x class getter-setter


【解决方案1】:

代码不起作用,因为您已将基础属性命名为与相应属性相同。

您需要使用与属性 getter/setter 所指的属性名称相同的属性名称:

class States:
    def __init__(self, f=0, n=0):
        self._state = n          # <-- changed here
        self._level_state = f    # <-- changed here

    @property
    def state(self, n):
        return self._state

    @state.setter
    def state(self, n):
        self._state = n

    @property
    def level_state(self, f):
        return self._level_state

    @level_state.setter
    def state(self, f):
        self._level_state = f

但这种情况下的简单解决方案是根本不使用属性:

class States:
    def __init__(self, f=0, n=0):
        self.state = n
        self.level_state = f
    # done

【讨论】:

  • 感谢您的回答,我最终使用了两个要更新的全局变量,它解决了我的问题。
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多