Python - почему свойство read-only доступно для записи?

Я пытаюсь определить класс с свойством только для чтения в Python; Я следовал документации Python и придумал следующий код:

#!/usr/bin/python

class Test:
        def __init__(self, init_str):
                self._prop = init_str

        @property
        def prop(self):
                return self._prop

t = Test("Init")
print t.prop
t.prop = "Re-Init"
print t.prop

Теперь, когда я пытаюсь выполнить код, хотя ожидаю ошибки/исключения, я вижу, что он выполняется нормально:

$ ./python_prop_test 
Init
Re-Init

Моя версия Python - 2.7.2. Что я вижу, это ожидалось? Как убедиться, что свойство не установлено?

Ответы

Ответ 1

Чтобы это работало так, как вы ожидаете, Test должен быть классом нового стиля:

class Test(object):
          ^^^^^^^^

Это указано в документации для property():

Возвращает атрибут свойства для классов нового стиля (классы, полученные из object).

Когда я превращаю Test в класс нового стиля и пытаюсь изменить prop, я получаю исключение:

In [28]: t.prop='Re-Init'

AttributeError: can't set attribute

Ответ 2

Чтобы использовать свойства, вы должны использовать классы нового стиля. Чтобы использовать классы нового стиля в Python 2, вы должны наследовать от object. Измените свой класс def на class Test(object).