Does Python really follow its philosophy of "Readability counts"?
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Thu Jan 22 08:32:51 EST 2009
On Thu, 22 Jan 2009 10:33:26 +0100, Bruno Desthuilliers wrote:
> Steven D'Aprano a écrit :
>> On Wed, 21 Jan 2009 12:54:31 +0100, Bruno Desthuilliers wrote:
>>
>>> Russ P. a écrit :
>>> (snip)
>>>> In any case, I have suggested that Python should perhaps get a new
>>>> keyword, "private" or "priv".
>>> And quite a few people - most of them using Python daily - answered
>>> they didn't wan't it.
>>
>> Then they don't have to use it.
>
> Yes they would. Because this would become the official way to tell
> what's interface and what's implementation, and *this* is the important
> point.
But if you have free access to attributes, then *everything* is interface.
>> Lots of people think that double-underscore name mangling is a waste of
>> time: not strict enough to be useful, not open enough to be Pythonic.
>> Solution? Don't use double-underscore names.
>
> The name-mangling mechanism is actually useful when you want to make
> sure some vital implementation attribute (usually of a class intented to
> be extended by the library users) won't be *accidentally* overwritten.
Except it doesn't. Take this simple module:
# module.py
class C(object):
__n = 3
def spam(self):
return "spam " * self.__n
class D(C):
pass
# end module.py
I have no interest in C; I may have no idea it even exists. It might be
buried deep inside the inheritance hierarchy of the class I really want,
D. So now I subclass D:
>>> from module import D
>>> class C(D):
... __n = 5
... def ham(self):
... return "I eat ham %d times a day" % self.__n
...
>>> C().ham()
'I eat ham 5 times a day'
>>>
>>> assert C().spam() == D().spam()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
And now I have accidentally broken the spam() method, due to a name clash.
Besides, double-underscore names are a PITA to work with:
>>> class Parrot(object):
... __colour = 'blue'
... def __str__(self):
... return 'A %s parrot' % self.__colour
... __repr__ = __str__
...
>>>
>>> class RedParrot(Parrot): # Just like Parrot, only red.
... __colour = 'red'
...
>>>
>>> Parrot()
A blue parrot
>>> RedParrot()
A blue parrot
--
Steven
More information about the Python-list
mailing list