Newbie Q: Class Privacy (or lack of)

Marc 'BlackJack' Rintsch bj_666 at gmx.net
Fri Jul 28 06:38:31 EDT 2006


In <1154080289.251993.137560 at b28g2000cwb.googlegroups.com>, Timo wrote:

> Steve Jobless kirjoitti:
> 
>> Let's say the class is defined as:
>>
>>   class MyClass:
>>     def __init__(self):
>>       pass
>>     def func(self):
>>       return 123
>>
>> But from the outside of the class my interpreter let me do:
>>
>>   x = MyClass()
>>   x.instance_var_not_defined_in_the_class = 456
>>
>> or even:
>>
>>   x.func = 789
>>
>> After "x.func = 789", the function is totally shot.
>>
> 
> You can avoid the problem by using the __slots__ definition and
> new-style classes (inherit from object):
> 
> class MyClass(object):
> 
>     __slots__ = ('bar',)
> 
>     def func(self):
>         return 123
> 
> x = MyClass()
> x.instance_var_not_defined_in_the_class = 456
> ==>
> AttributeError: 'MyClass' object has no attribute
> 'instance_var_not_defined_in_the_class'
> 
> x.func = 789
> ==>
> AttributeError: 'MyClass' object attribute 'func' is read-only
> 
> Only the bar-attribute can be set:
> 
> x.bar = 'foo'

This avoids the problem but you get others in return.  And it's an abuse
of `__slots__` which is meant as a way to save memory if you need really
many objects of that type and not as "protection".

Ciao,
	Marc 'BlackJack' Rintsch



More information about the Python-list mailing list