Python @property setter没有从实例调用设置

时间:2018-06-14 06:57:31

标签: python getter-setter python-object

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

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,而不是使用setter因此永远不会设置self._OrderStatus

我是否在使用getter和setter时做了明显不好的事情?他们为什么不被称为他们应该被召唤?

1 个答案:

答案 0 :(得分:0)

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

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'