Why can't I directly add attributes to any python object?
Question: I have this code:

    
    
    >>> class G:
    ...   def __init__(self):
    ...     self.x = 20
    ...
    >>> gg = G()
    >>> gg.x
    20
    >>> gg.y = 2000
    

And this code:

    
    
    >>> from datetime import datetime
    >>> my_obj = datetime.now()
    >>> my_obj.interesting = 1
    *** AttributeError: 'datetime.datetime' object has no attribute 'interesting'
    

From my Python knowledge, I would say that `datetime` overrides
`setattr`/`getattr`, but I am not sure. Could you shed some light here?

EDIT: I'm not specifically interested in `datetime`. I was wondering about
objects in general.


Answer: My guess, is that the implementation of datetime uses
[__slots__](http://docs.python.org/reference/datamodel.html#id3) for better
performance.

When using `__slots__`, the interpreter reserves storage for just the
attributes listed, nothing else. This gives better performance and uses less
storage, but it also means you can't add new attributes at will.

Read more here: <http://docs.python.org/reference/datamodel.html>

