Why does python not have a mechanism for data hiding?
pavlovevidence at gmail.com
Mon Jun 2 14:14:59 CEST 2008
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
> > Red Herring.
> > 1. This doesn't hide the variables; it just changes their spelling.
> > 2. This also "hides" the variables from its own class.
> > 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.
> 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.
More information about the Python-list