Python @属性 setter 不是从实例调用设置
Python @property setter not setting from instance call
我有一个class(简化视图):
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
现在这个 class 从不同的模块调用并使用如下:
from core.record import Record
r = Record()
r.OrderStatus = '2'
出于某种原因,但是当我稍后调用 r.OrderStatus
时,将其称为 returns '2'
而不是 'FILL'
。
在 VisualStudio 中调试变量我可以看到,当我调用 r.OrderStatus = '2'
时它实际上出现了,它从不使用 @OrderStatus.setter
而是似乎动态地使其成为自己的变量 OrderStatus
,而不是使用 setter 因此永远不会设置 self._OrderStatus
.
我在使用 getter 和 setters 时做了一些明显不好的事情吗?为什么他们没有按应有的方式被调用?
描述符和属性仅在新样式 classes 中受支持。您需要始终从对象 class 继承以使其成为新样式,并且使用此 属性 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'
我有一个class(简化视图):
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
现在这个 class 从不同的模块调用并使用如下:
from core.record import Record
r = Record()
r.OrderStatus = '2'
出于某种原因,但是当我稍后调用 r.OrderStatus
时,将其称为 returns '2'
而不是 'FILL'
。
在 VisualStudio 中调试变量我可以看到,当我调用 r.OrderStatus = '2'
时它实际上出现了,它从不使用 @OrderStatus.setter
而是似乎动态地使其成为自己的变量 OrderStatus
,而不是使用 setter 因此永远不会设置 self._OrderStatus
.
我在使用 getter 和 setters 时做了一些明显不好的事情吗?为什么他们没有按应有的方式被调用?
描述符和属性仅在新样式 classes 中受支持。您需要始终从对象 class 继承以使其成为新样式,并且使用此 属性 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'