Am 29.07.2011 17:12 schrieb Ciantic:
class MyObject(object):
...     pass
...
my = MyObject()
my.myvar = 'value' # No error!

obj = object()
obj.myvar = 'value'  # Causes error!
Traceback (most recent call last):
   File "<stdin>", line 1, in<module>
AttributeError: 'object' object has no attribute 'myvar'

Why simple inheritance from object does not cause errors at setattr,
yet direct init of object() does?


I was trying to "decor" objects, lists etc with own attributes that
could be used in templates and was sadly not permitted to do so:

something = [1,2]
something.myvar = 'value'
Traceback (most recent call last):
   File "<stdin>", line 1, in<module>
AttributeError: 'list' object has no attribute 'myvar'

(I could "solve" this by inheriting from list, but there are cases
where I can't do so, the data is coming elsewhere and wrapping it is
ugly, adding new attribute would be neater)

But my question now is why this setattr problem happens on some types?
What are the types that usually does not allow to arbitrary setattr?

>>> a=object()
>>> class C(object): pass
...
>>> b=C()
>>> dir(a)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> dir(b)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']


What are the differences?

['__dict__', '__module__', '__weakref__']

As the attributes are stored in __dict__, I would suppose that it is __dict__ which makes the difference. object() has no such and therefore there is no place to save an attribute.


Thomas
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to