Question

I am trying to define a class with a read-only property in a Python; I followed Python documentation and came up with the following code:

#!/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

Now when I try to execute the code though I am expecting error/exception I see it getting executed normally:

$ ./python_prop_test 
Init
Re-Init

My Python version is 2.7.2. What I am seeing, is it expected? How do make sure a property is not settable?

Was it helpful?

Solution

For this to work as you expect, Test needs to be a new-style class:

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

This is hinted at in the documentation for property():

Return a property attribute for new-style classes (classes that derive from object).

When I turn Test into a new-style class, and attempt to change prop, I get an exception:

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

AttributeError: can't set attribute

OTHER TIPS

To use properties you must use new-style classes. To use new-style classes in Python 2 you must inherit from object. Change your class def to class Test(object).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top