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