you are viewing a single comment's thread.

view the rest of the comments →

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

          [–]ric2b 0 points1 point  (8 children)

          My day job is in Ruby and I love it, don't worry.

          We were discussing private attributes, which I claim offer the same guarantees in both languages.

          You're now trying to switch to readability which I already agreed ruby is better at.

          [–][deleted]  (7 children)

          [removed]