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