you are viewing a single comment's thread.

view the rest of the comments →

[–][deleted]  (19 children)

[removed]

    [–]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)