How to restrict setting an attribute outside of constructor?
python, setattr, variable-assignment
Solution
The usual way is to use a "private" attribute starting with an underscore, and a read-only property for public access:
import operator
class Person(object):
def __init__(self, name, ssn):
self.name = name
self._ssn = ssn
ssn = property(operator.attrgetter("_ssn"))
Note that this does not really hinder anybody to change the attribute `_ssn`, but the leading `_` documents that the attribute is private.
Problem
I want to forbid further assignments on some attributes of a class after it was initialized. For instance; no one can explicitly assign any value to 'ssn' (social security number) property after the Person instance 'p' has been initialized. _setattr_ is also being called while assigning the value inside _init_ method, thus it is not what I want. I'd like to restrict only further assignments. How can I achieve that? ``` class Person(object): def __init__(self, name, ssn): self.name = name self._ssn = ssn def __setattr__(self, name, value): if name == '_ssn': raise AttributeError('Denied.') else: object.__setattr__(self, name, value) >> p = Person('Ozgur', '1234') >> AttributeError: Denied. ```