title: How to do encapsulation in Python?
body: <p>What's wrong with this? From objective, and functional standpoints?</p>
  
  <pre><code>import sys
  
  class EncapsulationClass(object):
  
    def __init__(self):
      self.privates = ["__dict__", "privates", "protected", "a"]
      self.protected = ["b"]
  
      print self.privates
  
      self.a = 1
      self.b = 2
      self.c = 3
      pass
  
    def __getattribute__(self, name):
      if sys._getframe(1).f_code.co_argcount == 0:
        if name in self.privates:
          raise Exception("Access to private attribute \"%s\" is not allowed" % name)
        else:
          return object.__getattribute__(self, name)
      else:
        return object.__getattribute__(self, name)
  
    def __setattr__(self, name, value):
      if sys._getframe(1).f_code.co_argcount == 0:
        if name in self.privates:
          raise Exception("Setting private attribute \"%s\" is not allowed" % name)
        elif name in self.protected:
          raise Exception("Setting protected attribute \"%s\" is not allowed" % name)
        else:
          return object.__setattr__(self, name, value)
      else:
        return object.__setattr__(self, name, value)
  
  
  example = EncapsulationClass()
  
  example.a = 10 # Exception: Setting private attribute "a" is not allowed
  example.b = 10 # Exception: Setting protected attribute "b" is not allowed
  example.c = 10 # example.c == 10
  
  example.__dict__["privates"] # Exception: Setting protected attribute "b" is not allowed
  </code></pre>
  
  <p>What would actually be wrong with doing something like this?</p>
  
  <p>Is there any better way to achieve encapsulation in Python?</p>