How object's setattr differs from inherited?

Thomas Rachel nutznetz-0c1b6768-bfa9-48d5-a470-7603bd3aa915 at spamschutz.glglgl.de
Fri Jul 29 18:09:52 CEST 2011


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



More information about the Python-list mailing list