← Back to context

Comment by vbezhenar

4 days ago

So Python is not OOP language? You can't hide fields.

You can hide fields in Python with a little bit of gymnastics:

  class EncapsulatedCounter:
      def __init__(self, initial_value):
          _count = initial_value

          def increment():
              nonlocal _count
              _count += 1
              return _count

          self.increment = increment


  counter = EncapsulatedCounter(100)
  new_value = counter.increment()
  print(f"New value is: {new_value}")

  • Usually, a simple function is enough:

        def make_counter(start=0):
          count = start
          def incr():
            nonlocal count
            count += 1
            return count
          return incr
    

    Example:

        >>> c = make_counter()
        >>> c()
        1
        >>> c()
        2
    

    But it hides nothing:

        >>> c.__closure__[0].cell_contents
        2
        >>> c.__closure__[0].cell_contents = -1
        >>> c()
        0
    

    "private" in Python is cultural, not enforced. (you can access `self.__private` from outside too if you want).