Geo
Geo

Reputation: 96987

Why can't I directly add attributes to any python object?

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.

Upvotes: 22

Views: 9437

Answers (3)

s29
s29

Reputation: 2057

While the question has already been answered; if anyone is interested in a workaround, here's an example --

mydate = datetime.date(2013, 3, 26)
mydate.special = 'Some special date annotation'  # doesn't work
...
class CustomDate(datetime.date):
    pass
mydate = datetime.date(2013, 3, 26)
mydate = CustomDate(mydate.year, mydate.month, mydate.day)
mydate.special = 'Some special date annotation'  # works

Upvotes: 3

Epcylon
Epcylon

Reputation: 4737

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

Upvotes: 34

S.Lott
S.Lott

Reputation: 392050

It's written in C

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

It doesn't seem to implement setattr.

Upvotes: 18

Related Questions