Duncan Booth duncan at NOSPAMrcp.co.uk
Tue Sep 10 04:16:12 EDT 2002

steven_shaw at adc.com (Steven Shaw) wrote in
news:66715c02.0209091923.265fe77e at posting.google.com: 

> I thought you could just extend an object's attributes at run-time
> like this: 
>>>> p = object()
>>>> p.x = 1
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
> AttributeError: 'object' object has no attribute 'x'

New style classes (which are those with 'object' or other builtin classes 
as a base class) do not all allow you to add arbitrary attributes:

If you have an object which is a builtin type (object, int, dict, ...) then 
you cannot add attributes. If you have an object which is a subclass of a 
builtin type, then you can add attributes unless the subclass defined a 
member __slots__.

The __slots__ attribute in a class, if defined, lists all of the attribute 
names settable in instances of that class. If no __slots__ attribute is 
directly defined in a class then you may add arbitrary attributes (this 
applies even if __slots__ is set in a base class).

An object of a builtin type, or with __slots__ defined in the class and 
all base classes does not have a __dict__ attribute. 

Duncan Booth                                             duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?

More information about the Python-list mailing list