On Jun 2, 9:07 am, Antoon Pardon <[EMAIL PROTECTED]> wrote: > On 2008-06-02, Carl Banks <[EMAIL PROTECTED]> wrote: > > > > > On Jun 2, 6:40 am, Antoon Pardon <[EMAIL PROTECTED]> wrote: > >> On 2008-06-02, Carl Banks <[EMAIL PROTECTED]> wrote: > > >> > On Jun 2, 5:38 am, Antoon Pardon <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list