【问题标题】:Python @property setter not setting from instance callPython @property setter 未从实例调用中设置
【发布时间】:2018-11-23 20:52:19
【问题描述】:

我有一个班级(简化视图):

class Record():

    OrderStatusMapping = dict(zip(['0', '1', '2'], ['NEWO', 'PARF', 'FILL']))

    def __init__(self):
        self._OrderStatus = None

    @property
    def OrderStatus(self):
        return self.OrderStatusMapping.get(self._OrderStatus)

    @OrderStatus.setter
    def OrderStatus(self, value):
        self._OrderStatus = value

现在这个类是从不同的模块调用的,如下所示:

from core.record import Record
r = Record()
r.OrderStatus = '2'

然而,当我后来调用r.OrderStatus 时,由于某种原因,它返回'2' 而不是'FILL'。 在 VisualStudio 中调试变量我可以看到实际上它出现在我调用 r.OrderStatus = '2' 时它从不使用 @OrderStatus.setter 而是似乎让它自己的变量 OrderStatus 在运行中,不使用设置器,因此从不设置 @987654332 @。

在使用 getter 和 setter 时,我做了什么明显不好的事情吗?为什么没有按应有的方式称呼他们?

【问题讨论】:

标签: python getter-setter python-object


【解决方案1】:

描述符和属性仅在新样式类中受支持。您需要始终从 Object 类继承以使其成为新样式,并且使用此属性设置器可以按预期工作。

In [29]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class Record(object):
:
:    OrderStatusMapping = dict(zip(['0', '1', '2'], ['NEWO', 'PARF', 'FILL']))
:
:    def __init__(self):
:        self._OrderStatus = None
:
:    @property
:    def OrderStatus(self):
:        return self.OrderStatusMapping.get(self._OrderStatus)
:
:    @OrderStatus.setter
:    def OrderStatus(self, value):
:        self._OrderStatus = value
:<EOF>

In [30]: r = Record()

In [33]: r.OrderStatus = '2'

In [34]: r.OrderStatus
Out[34]: 'FILL'

【讨论】:

  • 这个问题至少有两个重复,可能更多。对于如此明显的错误,在回答之前总是值得检查一下。
  • 知道了,那我也删掉我的:)
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2014-09-15
  • 2011-11-20
  • 2022-06-10
相关资源
最近更新 更多