On 10/23/2010 11:51 AM Arnaud Delobelle said...

Just to challenge you a bit, here is another (doomed) attempt at having
private attributes for object instances:


def private_maker():
     class Private: pass
     privmap = {}
     def private(f):
         def wrapper(self, *args, **kwargs):
             priv = privmap.setdefault(self, Private())
             return f(self, priv, *args, **kwargs)
         return wrapper
     return private

private = private_maker()

class A:
     @private
     def __init__(self, private, x):
         private.x = x
     @property
     @private
     def x(self, private):
         return private.x

del private

a = A(2)


Can you change the value of a.x?

(Hint: my shortest solution is of the form A.*.*[*].*[*].x = 3)



I'm obviously missing something:

ActivePython 2.6.1.1 (ActiveState Software Inc.) based on
Python 2.6.1 (r261:67515, Dec 5 2008, 13:58:38) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def private_maker():
...     class Private: pass
...     privmap = {}
...     def private(f):
...         def wrapper(self, *args, **kwargs):
...             priv = privmap.setdefault(self, Private())
...             return f(self, priv, *args, **kwargs)
...         return wrapper
...     return private
...
>>> private = private_maker()
>>>
>>> class A:
...     @private
...     def __init__(self, private, x):
...         private.x = x
...     @property
...     @private
...     def x(self, private):
...         return private.x
...
>>> del private
>>>
>>> a = A(2)
>>>
>>>
>>> a.x
2
>>> a.x=3
>>> a.x
3
>>>


Emile
















--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to