[pyar] Como hacer un objeto inmutable

Mariano Guerra luismarianoguerra en gmail.com
Vie Oct 28 10:34:28 ART 2011


2011/10/28 Daniel Moisset <dmoisset en machinalis.com>:
> 2011/10/28 Mariano Guerra <luismarianoguerra en gmail.com>
>>
>> 2011/10/28 Facundo Batista <facundobatista en gmail.com>:
>> >>>> class ReadOnlyPoint(object):
>> > ...     _ro = False
>> > ...     def __init__(self, x, y):
>> > ...         self.x = x
>> > ...         self.y = y
>> > ...         self._ro = True
>> > ...     def __setattr__(self, name, value):
>> > ...         if self._ro:
>> > ...             raise AttributeError("Read only instance")
>> > ...         object.__setattr__(self, name, value)
>>
>> >>> p = ReadOnlyPoint(1,2)
>> >>> p.__dict__
>> {'y': 2, 'x': 1, '_ro': True}
>> >>> p.__dict__['x'] = 2
>> >>> p.x
>> 2
>> >>> p.__dict__['_ro'] = False
>> >>> p.x = 10
>> >>> p.x
>> 10
>
> Si es por dañino, la tuya (con clausuras) tambien se puede romper similarmente:
>
> In [18]: p = ReadOnlyPoint(1,2)
>
> In [19]: p.x
> Out[19]: 1
>
> In [20]: newx=10
>
> In [21]: p.__class__ = ReadOnlyPoint(newx,p.y).__class__
>
> In [22]: p.x
> Out[22]: 10
>
> :)

quiero retruco:

>>> p = ReadOnlyPoint(1,2)
>>> p.__class__.x = property(lambda self: 4)
>>> p.x
4

como defensa de mi inexistente orgullo, en estos casos no estas
mutando x, estas mutando el universo :P



More information about the pyar mailing list