A single underscore is just a naming convention, but double underscores triggers automatic name-mangling of the variable in question:
$ cat test.py
classfoo:def__init__(self, x):
self.__x = x
f = foo(1)
f.__x
$ python3 test.py
Traceback (most recent call last):
File"/mnt/d/test.py", line 6, in <module>
f.__x
AttributeError: 'foo' object has no attribute '__x'
However, much like private/protected variables in java, this is pretty trivial to circumvent if you want.
But I don’t believe that you can argue that access modifiers are required for OO not to be shoehorned into a language, not when influential OO languages like Smalltalk didn’t have this feature either. Java just happens to be closer to C++, where public/private/protected is much more rigidly enforced than either Java or Python
A single underscore is just a naming convention, but double underscores triggers automatic name-mangling of the variable in question:
$ cat test.py class foo: def __init__(self, x): self.__x = x f = foo(1) f.__x $ python3 test.py Traceback (most recent call last): File "/mnt/d/test.py", line 6, in <module> f.__x AttributeError: 'foo' object has no attribute '__x'
However, much like private/protected variables in java, this is pretty trivial to circumvent if you want.
But I don’t believe that you can argue that access modifiers are required for OO not to be shoehorned into a language, not when influential OO languages like Smalltalk didn’t have this feature either. Java just happens to be closer to C++, where public/private/protected is much more rigidly enforced than either Java or Python