Why does python not have a mechanism for data hiding?

Carl Banks pavlovevidence at gmail.com
Mon Jun 2 15:41:48 CEST 2008


On Jun 2, 9:07 am, Antoon Pardon <apar... at forel.vub.ac.be> wrote:
> On 2008-06-02, Carl Banks <pavlovevide... at gmail.com> wrote:
>
>
>
> > On Jun 2, 6:40 am, Antoon Pardon <apar... at forel.vub.ac.be> wrote:
> >> On 2008-06-02, Carl Banks <pavlovevide... at gmail.com> wrote:
>
> >> > On Jun 2, 5:38 am, Antoon Pardon <apar... at forel.vub.ac.be> wrote:
> >> >> If you really need it, you can do data hiding in python. It just
> >> >> requires a bit more work.
>
> >> >> ----------------------------- Hide.py ---------------------------------
> >> >> class Rec(object):
> >> >>      def __init__(__, **kwargs):
> >> >>          for key,value in kwargs.items():
> >> >>              setattr(__, key, value)
>
> >> >>      def __getitem__(self, key):
> >> >>          return getattr(self, key)
>
> >> >>      def __setitem__ (self, key, val):
> >> >>          setattr(self, key, val)
>
> >> >> class Foo(object):
>
> >> >>   def __init__(self):
>
> >> >>     hidden = Rec(x=0, y=0)
>
> >> >>     def SetX(val):
> >> >>       hidden.x = val
>
> >> >>     def SetY(val):
> >> >>       hidden.y = val
>
> >> >>     def GetX():
> >> >>       return hidden.x
>
> >> >>     def GetY():
> >> >>       return hidden.y
>
> >> >>     self.SetX = SetX
> >> >>     self.SetY = SetY
> >> >>     self.GetX = GetX
> >> >>     self.GetY = GetY
>
> >> > In other words, it's a useless no-op.
>
> >> > In fact, I'd say this is even worse than useless.  Creating accessor
> >> > functions is a sort of blessing for external use.  Knowing that there
> >> > are accessor functions is likely to cause a user to show even less
> >> > restraint.
>
> >> I think you completed missed the point.
>
> > I'm not sure I missed the point so much as I failed to read your mind.
>
> Fine with me, it is just the other side of the coin.
>
> >> This is just a proof of concept thing. In a real example there would
> >> of course no Set en Get methods but just methods that in the course
> >> of their execution would access or update the hidden attributes
>
> > Fair enough, but I don't see anything in your example that suggests a
> > way to discriminate between access from within the class and access
> > from outside the class, which is the crucial aspect of data hiding.
>
> The fact is that hidden and its attributes are not accessible from
> outside the instance. They are only accessible to the local functions
> of __init__. By binding those local functions as atributes to the
> instance, hidden can be modified by what for all practical purposes
> looks like a method call, but really is a closure call.

You haven't hidden the data at all, all you've done is to change the
means of accessing it.  What difference does it make whether I write
foo.getX() or foo.x?  Everyone in the world still has full access to
the data.

You are not realizing that only useful(**) thing about data hiding is
that some code has access to the data, other code does not.  If you
"hide" data equally from everyone it's just a useless spelling change.


** - Usefulness is questionable in most cases, but we assume it is
here for the sake of argument.


Carl Banks



More information about the Python-list mailing list