Question about properties

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Frank Millman

    Question about properties

    Hi all

    I have started experimenting with properties.

    The example in the 2.5 docs uses an inconsistent mixture of single and
    double underscores for the internal representation of the attribute. I
    was going to file a documentation bug, but then I checked the 2.6 docs
    online, and I see it has been fixed, by using single underscores
    throughout.

    IMHO, it would make more sense to use double underscores throughout. I
    thought that the main point of using property was to prevent direct
    access to the attribute. With a single underscore you can access it if
    you prefix the attribute name with a single underscore, thus bypassing
    the logic in 'property'.

    Is this a valid comment, or does it come under the category of 'we are
    all adults here'?

    While experimenting, I came across the following curiosity.

    I know that prefixing a class attribute with a double-underscore makes
    it difficult to access the attribute externally. Here is a simple
    example -
    >>>class Test(object):
    .... def __init__(self,x ):
    .... self.x = x
    .... self.__y = 123
    .... def get_y(self):
    .... return self.__y
    >>>t = Test(99)
    >>>t.x
    99
    >>>t.get_y()
    123
    >>>t.__y
    AttributeError: 'Test' object has no attribute '__y'

    I was surprised that I could do the following -
    >>>t.__y = 456
    >>>t.__y
    456
    >>>t.get_y()
    123

    It's not important, but I am curious to know what is going on
    internally here.

    Frank Millman
  • Fredrik Lundh

    #2
    Re: Question about properties

    Frank Millman wrote:
    I thought that the main point of using property was to prevent direct
    access to the attribute.
    Not "prevent access to" as much as "add behaviour to".
    Is this a valid comment, or does it come under the category of 'we are
    all adults here'?
    The latter. And the "__" doesn't provide much protection, really (as
    we'll see below).
    While experimenting, I came across the following curiosity.
    >
    I know that prefixing a class attribute with a double-underscore makes
    it difficult to access the attribute externally. Here is a simple
    example -
    >
    >>>class Test(object):
    ... def __init__(self,x ):
    ... self.x = x
    ... self.__y = 123
    ... def get_y(self):
    ... return self.__y
    >
    >>>t = Test(99)
    >>>t.x
    99
    >>>t.get_y()
    123
    >>>t.__y
    AttributeError: 'Test' object has no attribute '__y'
    >
    I was surprised that I could do the following -
    >
    >>>t.__y = 456
    >>>t.__y
    456
    >>>t.get_y()
    123
    >
    It's not important, but I am curious to know what is going on
    internally here.
    hint:
    >>dir(t)
    ['_Test__y', ..., '__y', 'get_y', 'x']
    >>t._Test__y
    123
    >>t.__y
    456

    </F>

    Comment

    Working...