> ___________________________________________
> 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

Reply via email to