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 -- http://mail.python.org/mailman/listinfo/python-list