Установщик Python @property не устанавливается из вызова экземпляра

У меня есть класс (упрощенный вид):

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 на лету, не используя сеттер и, следовательно, никогда не настройте self._OrderStatus,

Я делаю что-то явно плохое в использовании геттеров и сеттеров? Почему их не называют, как они должны быть?

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'
Другие вопросы по тегам