Why does python not have a mechanism for data hiding?
Larry Bates
larry.bates at websafe.com`
Thu Jun 5 15:50:24 EDT 2008
Russ P. wrote:
> On Jun 2, 5:11 pm, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:
>> "Russ P." <Russ.Paie... at gmail.com> writes:
>>> I also realize, by the way, that Python allows a client of a class to
>>> define a new class member from completely outside the class
>>> definition. Obviously, that cannot be declared private.
>> This is bogus about 95% of the time though. For the cases where it is
>> really desired, I think it's best to require the target class to be
>> enable it specifically somehow, maybe by inheriting from a special
>> superclass. That could let the compiler statically resolve member
>> lookups the rest of the time.
>
> It did seem a bit odd to me when I realized that you can add data
> members (or even a "methods") to a class from completely outside the
> class definition. That can be risky, of course, and as you suggest,
> perhaps it shouldn't even be allowed by default.
>
> I usually find that it's safer to initialize in the constructor all
> (or nearly all) of the data members that will be needed in a class. If
> I need a list that will be populated later, for example, I reserve the
> name with an empty list in the constructor. Then, if for some reason
> the list gets accessed before it is populated, I don't get an
> exception.
That is EXACTLY when I want an exception, I did something that shouldn't happen.
You also are missing the nice ability of python to use hasattr() to find out
if a class instance has a method/attribute. I use hasattr() to test for
presence or absence of methods/attributes quite a lot. In the past I did what
you describe, but found that to be limiting and a throwback to when I used
languages that could not do introspection. I can test to see if the attribute
exists, if it is empty, which can be two very different conditions that require
two different actions. The only way you can do that is to initialize it to
None. While this works it is a fictitious construct that we all learned when we
were writing Fortran, Basic or Cobol years ago (oops I think I just revealed
that I'm an 'old timer'). Now I just do: if hasattr(self, 'listInQuestion') and
I can tell if it has been created (either by constructor) or by some other
method. This works particularly well when I do caching of data in objects that
are shared among methods. I can also do hasattr(object, 'methodInQuestion') to
see if the object implements an interface that I require.
May be a little off topic, but I think it is relevant.
-Larry
More information about the Python-list
mailing list