Невозможно установить Python @Property - PullRequest
0 голосов
/ 04 марта 2020

Я создаю python класс из необработанных данных следующим образом:

Class Test:

def __init__(self, raw_number):
    self._raw_number = raw_number

Затем я вычисляю _raw_number как свойство, чтобы вернуть фактическое число, которое я хотел бы иметь:

@property
def number(self):
    return self._raw_number[0]

Однако при попытке установить это свойство для объекта Test с использованием

t = Test([1, 2, 3]) # this will set the number property to 1
t.number = 5 # this is supposed to set the number property to 5

я сталкиваюсь с ошибкой, которая говорит property number cannot be set.

I мне интересно, почему я могу решить это?

1 Ответ

2 голосов
/ 04 марта 2020

@property сам по себе (по крайней мере, при использовании, как показано) только обеспечивает получение. Если вы также не предоставите установщик, свойство доступно только для чтения.

class Test:

    def __init__(self, raw_number):
        <b>self.number</b> = raw_number

    @property
    def number(self):
        return self._raw_number[0]

    <b>@number.setter
    def number(self, value):
        self._raw_number = value</b>

Имейте в виду, что установщик должен отвечать за то, чтобы значение _raw_number было фактически индексируемым. Кроме того, метод __init__ может использовать установщик при инициализации свойства; только сами получатель и установщик должны иметь доступ к базовому атрибуту _raw_number.


property может использоваться для одновременной установки получателя и установщика.

class Test:
    def __init__(self, raw_number):
        self.number = raw_number

    def _getter(self):
        return self._raw_number[0]

    def _setter(self, value):
        try:
            value[0]
        except IndexError:
            raise TypeError("Value must be indexable")
        self._raw_number = value

    number = property(_getter, _setter)

    # Clean up the namespace before creating the class
    del _getter
    del _setter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...