Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Which way to say 'private'?

Reply
Thread Tools

Which way to say 'private'?

 
 
Daniel Klein
Guest
Posts: n/a
 
      08-21-2003
There are 2 ways to indicate private members of classes, by prepending
1 or 2 underscore characters, the latter causing name mangling. My
question is: When would I use which kind to indicate privacy?

Thanks,
Daniel Klein
Member of the Dead Parrot Society
 
Reply With Quote
 
 
 
 
Sean Ross
Guest
Posts: n/a
 
      08-21-2003
"Daniel Klein" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> There are 2 ways to indicate private members of classes, by prepending
> 1 or 2 underscore characters, the latter causing name mangling. My
> question is: When would I use which kind to indicate privacy?


Hi.
The single underscore (self._attribute) is the convention when you wish to
indicate privacy. Where by "indicate" I mean that you wish to convey to
readers of the code that they should not access this attribute directly.
They can, but you are telling them that it's not the best practice for your
API. The double underscore (self.__attribute) mangles the name (as you've
mentioned), so it adds an extra disincentive to using that attribute
directly (at the very least, using instance._ClassName__attribute makes for
unattractive code). So, the latter method is used when you would really,
really prefer that people not access a particular attribute directly
(Nothing is stopping them, of course, but the intention is pretty clear).
Also, when someone subclasses your class, it makes accessing the
"privatized" attribute a little more difficult.

>>> class C1:

.... def __init__(self, value=1):
.... self.__value = value
....
>>> class C2(C1):

.... def __init__(self):
.... C1.__init__(self)
....
>>> c2 = C2()
>>> dir(c2)

['_C1__value', '__doc__', '__init__', '__module__']
# ^^^^^^^^^^^
# Here's the "private" attribute


Personally, I use single underscore to denote "protected", and double
underscore to denote "private" (if I use them at all).

HTH
Sean



 
Reply With Quote
 
 
 
 
Alex Martelli
Guest
Posts: n/a
 
      08-21-2003
Daniel Klein wrote:

> There are 2 ways to indicate private members of classes, by prepending
> 1 or 2 underscore characters, the latter causing name mangling. My
> question is: When would I use which kind to indicate privacy?


You would normally use a single underscore, which is an advisory
indication of privacy. You would use two underscores, with the
mangling they produce, when you need to ensure against any risk
of accidental conflict with other existing names in the same space.

For example, if your class injects for its own purposes attributes
in other unrelated objects, it might be quite prudent to use the
double-underscore syntax for the names of those 'alien' attributes,
otherwise name clashes are far too likely to occur.


Alex

 
Reply With Quote
 
Daniel Klein
Guest
Posts: n/a
 
      08-21-2003
On Thu, 21 Aug 2003 11:42:02 -0400, "Sean Ross"
<(E-Mail Removed)> wrote:

>"Daniel Klein" <(E-Mail Removed)> wrote in message
>news:(E-Mail Removed).. .
>> There are 2 ways to indicate private members of classes, by prepending
>> 1 or 2 underscore characters, the latter causing name mangling. My
>> question is: When would I use which kind to indicate privacy?

>
>Personally, I use single underscore to denote "protected", and double
>underscore to denote "private" (if I use them at all).


Thanks for the courtesy or your reply, Sean.

I should probably have mentioned that I am concerned about advertising the
'public' interface (so that users of the class know how best to use it and
what my intentions were) more than 'restricting' access to 'private' members,
which we all know is pretty much pointless in Python

Thanks again,

Dan
 
Reply With Quote
 
A. Lloyd Flanagan
Guest
Posts: n/a
 
      08-21-2003
Daniel Klein <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>. ..
> There are 2 ways to indicate private members of classes, by prepending
> 1 or 2 underscore characters, the latter causing name mangling. My
> question is: When would I use which kind to indicate privacy?
>
> Thanks,
> Daniel Klein
> Member of the Dead Parrot Society


Well, one underscore is sort of a gentleman's agreement, it's like a
suggestion "you really should think before you touch this". Two
underscores is a stronger suggestion, like "I don't want you to touch
this and you'll have to go through hoops to do it".
Personally I always use two underscores for class-level data, and
write accessor methods.
One underscore is useful in a package-level declaration to prevent it
from being exported.
Hope this helps.
 
Reply With Quote
 
Jacek Generowicz
Guest
Posts: n/a
 
      08-22-2003
Daniel Klein <(E-Mail Removed)> writes:

> On Thu, 21 Aug 2003 11:42:02 -0400, "Sean Ross"
> <(E-Mail Removed)> wrote:
>
> >"Daniel Klein" <(E-Mail Removed)> wrote in message

>
> >Personally, I use single underscore to denote "protected", and double
> >underscore to denote "private" (if I use them at all).


This is not the orthodox convention: single underscore indicates
"privacy" (more accurately: "this isn't part of the interface"):
double underscore is actually a mechanism for avioiding name clashes.

> I should probably have mentioned that I am concerned about advertising the
> 'public' interface (so that users of the class know how best to use it and
> what my intentions were) more than 'restricting' access to 'private' members,
> which we all know is pretty much pointless in Python


Definitely single underscore.

(Also, remember that, with properties, you can have things which look
like direct attributes actulally be set and read with setter and
getter functions, so it is perfectly OK to make data attributes be
part of the interface, as you can later install getters and setters
for them without changing the interface.)
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
You Say “Fragmentation”, I Say “Differentiation” Lawrence D'Oliveiro NZ Computing 2 10-06-2010 04:44 AM
Is there any way to say ignore case with "in"? tinnews@isbd.co.uk Python 7 04-07-2008 12:55 PM
You say SIM, I say SEM Anon Computer Security 1 03-18-2006 01:49 PM
elegant way to say "try this thing, one at a time, until conditionis met" David Garamond Ruby 21 06-01-2004 05:59 PM
how to Add different controls(textBox,DropDownList or some ) in the same column,based upon the value in the previous column (Say second Colum which contain dropdown with some values) ? Balaji ASP .Net Datagrid Control 0 07-07-2003 08:32 AM



Advertisments