Kent Tong wrote:

> Hi,
> 
> I can add new variables to user-defined classes like:
> 
>>>> class Test:
> ...     pass
> ...
>>>> a=Test()
>>>> a.x=100
> 
> but it doesn't work if the instances belong to a built-in class such as
> str or list:
> 
>>>> a='abc'
>>>> a.x=100
>  Traceback (most recent call last):
>    File "<stdin>", line 1, in <module>
>  AttributeError: 'str' object has no attribute 'x'
> 
> What makes this difference?

By default custom classes have a dictionary (called __dict__) to hold these 
attributes. If for every string or integer there were such a dict that would 
waste a lot of memory. You can subclass if you need it:

>>> class Str(str): pass
... 
>>> s = Str("hello")
>>> s.x = 42
>>> s
'hello'
>>> s.x
42

You can also avoid the dict in your own classes by specifiying slots for 
allowed attributes:

>>> class Test:
...     __slots__ = ("foo", "bar")
... 
>>> t = Test()
>>> t.foo = 42
>>> t.baz = "whatever"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Test' object has no attribute 'baz'

Use this feature sparingly, only when you know that there are going to be 
many (millions rather than thousands) of Test instances.

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

Reply via email to