views:

1654

answers:

2

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.

+13  A: 

My guess, is that the implementation of datetime uses __slots__ 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

Epcylon
Datetime is actually written in C, which gives behaviour very similar to writing a python object that uses __slots__. Slots are a way of writing objects in python that are almost as efficient as the C versions, without resorting to c
Jarret Hardie
So you could see the behaviour because the object is written in c, because it uses setattr, or because of slots :-)
Jarret Hardie
+11  A: 

It's written in C

http://svn.python.org/view/python/trunk/Modules/datetimemodule.c?view=markup

It doesn't seem to implement setattr.

S.Lott