> ___________________________________________ > class a: > i=0 > def setI(iii): > if self.i!=iii: > self.i=iii > #do some extra works here, e.g, notify the observers that > #this property is changed, or do some logging things. > ___________________________________________ > In the class "a" above, when "i" is changed, I will do some extra works, > the extra works could be very import, so I want to keep i invisible > to some others, they can only change i by the method setI. But python > can't ensure i to be invisible, everyone can change it whenever they > want! This is dangerous. >
>>> class test(object): ... __i = 0 ... def incr(self, n): self.__i += 1; print "incremented i" ... def geti(self): print "got i"; return self.__i ... i = property(geti, incr) ... >>> t = test() >>> t.i got i 0 >>> t.i += 5 got i incremented i >>> t.i got i 1 >>> dir(t) ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash_ _', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr_ _', '__setattr__', '__str__', '__weakref__', '_test__i', 'geti', 'i', 'incr'] >>> >>> #here's how the crazy hackers subclassing your code can break your super ... #special private variable! ... >>> t._test__i += 6 >>> t.i got i 7 But, if your users can't figure out that they shouldn't be changing the variable called t._test__i without expecting side effects, what do you think of the users of your class? Python is for consenting adults. Peace Bill Mill bill.mill at gmail.com -- http://mail.python.org/mailman/listinfo/python-list