Which way to say 'private'?

Discussion in 'Python' started by Daniel Klein, Aug 21, 2003.

  1. Daniel Klein

    Daniel Klein Guest

    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
     
    Daniel Klein, Aug 21, 2003
    #1
    1. Advertising

  2. Daniel Klein

    Sean Ross Guest

    "Daniel Klein" <> wrote in message
    news:...
    > 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
     
    Sean Ross, Aug 21, 2003
    #2
    1. Advertising

  3. 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
     
    Alex Martelli, Aug 21, 2003
    #3
  4. Daniel Klein

    Daniel Klein Guest

    On Thu, 21 Aug 2003 11:42:02 -0400, "Sean Ross"
    <> wrote:

    >"Daniel Klein" <> wrote in message
    >news:...
    >> 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
     
    Daniel Klein, Aug 21, 2003
    #4
  5. Daniel Klein <> wrote in message news:<>...
    > 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.
     
    A. Lloyd Flanagan, Aug 21, 2003
    #5
  6. Daniel Klein <> writes:

    > On Thu, 21 Aug 2003 11:42:02 -0400, "Sean Ross"
    > <> wrote:
    >
    > >"Daniel Klein" <> 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.)
     
    Jacek Generowicz, Aug 22, 2003
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. chetan
    Replies:
    5
    Views:
    378
    John Harrison
    Sep 21, 2004
  2. Replies:
    7
    Views:
    264
  3. Daniel T.
    Replies:
    1
    Views:
    328
    Kai-Uwe Bux
    Jan 20, 2009
  4. David Garamond
    Replies:
    21
    Views:
    278
    Gergely Kontra
    Jun 1, 2004
  5. matt neuburg

    ruby way to say this?

    matt neuburg, Oct 17, 2006, in forum: Ruby
    Replies:
    12
    Views:
    160
Loading...

Share This Page