Chris Angelico wrote: > On Sat, Nov 7, 2015 at 6:30 AM, Bartc <b...@freeuk.com> wrote: >> Is there no way then in Python to declare: >> >> pi = 3.141519 # etc >> >> and make it impossible to override? > > Nope. Even in C++, where classes can define certain things as const, > private, and other such restrictions, you can always get around them > by manipulating pointers appropriately. In Python, there's a > *convention* that a leading underscore means "private", but the > language doesn't enforce anything about it.
It is certainly possible for attributes of (instances of) new-style classes (starting with Python 3.2 at the latest) to be read-only by declaring them a property that does not have a setter, or one that has a setter that throws a specific exception (here: the former): #-------------------------- class SafeMath(object): def __init__ (self): from math import pi self._pi = pi @property def pi (self): return self._pi #-------------------------- | >>> math = SafeMath() | >>> math.pi | 3.141592653589793 | >>> math.pi = 42 | Traceback (most recent call last): | File "<stdin>", line 1, in <module> | AttributeError: can't set attribute (Or you can use “pi = property(…)” within the class declaration.) In theory, it should be possible to substitute “math” with a reference to an object that acts as a proxy for the original “math” module object but whose base class declares the attributes for all the constants read-only. -- PointedEars Twitter: @PointedEars2 Please do not cc me. / Bitte keine Kopien per E-Mail. -- https://mail.python.org/mailman/listinfo/python-list