Why does python not have a mechanism for data hiding?

Antoon Pardon apardon at forel.vub.ac.be
Mon Jun 2 09:07:35 EDT 2008


On 2008-06-02, Carl Banks <pavlovevidence 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.

-- 
Antoon Pardon



More information about the Python-list mailing list