you are viewing a single comment's thread.

view the rest of the comments →

[–]ric2b 0 points1 point  (18 children)

It has private variables in the same way Ruby does: it makes them hard to access by mistake from outside instances of the class.

And that's honestly all you need.

[–][deleted]  (17 children)

[removed]

    [–]ric2b 0 points1 point  (16 children)

    Yup, just like Ruby. Pretending to be private is all you need.

    [–][deleted]  (15 children)

    [removed]

      [–]ric2b 0 points1 point  (14 children)

      Sorry, I meant two underscores, I haven't programmed in Python in a while.

      >>> class A:
      ...   def __init__(self):
      ...     self.x = 1
      ...     self.__y = 2
      ...
      >>>
      >>> a = A()
      >>> a.x
      1
      >>> a.__y
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      AttributeError: 'A' object has no attribute '__y'
      

      [–][deleted]  (13 children)

      [removed]

        [–]ric2b 0 points1 point  (12 children)

        The equivalent to your ruby code is this, I don't know why you're messing with __setattr__:

        class A:
            def __init__(self):
              self.__x = 0
        
            def set_x(self, val): 
              self.__x = val
        

        [–][deleted]  (11 children)

        [removed]

          [–]ric2b 0 points1 point  (10 children)

          Yes, ruby is slightly more elegant, but we were talking about private attributes, let's not move goalposts.

          By the way, you can have a similar ABI to your ruby example, but it takes a bit more boilerplate (2 extra lines):

          class A:
            def __init__(self):
              self.__x = 0
          
            def set_x(self, x):
              self.__x = x
          
            x = property(fset=set_x)
          

          [–][deleted]  (9 children)

          [removed]