• Albbi@piefed.caOP
    link
    fedilink
    English
    arrow-up
    1
    ·
    2 days ago

    I was looking to see if there are equivalents to Java’s private and protected members, and it looks like Python’s answer to that is just throw one or two underscores in front of things to do that. And it doesn’t really do anything, more of just a naming convention. To me that feels like a basic OO structure that is shoehorned into Python.

    • fruitcantfly@programming.dev
      link
      fedilink
      arrow-up
      2
      ·
      5 hours ago

      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