Pavel Volkov <sai...@lists.xtsubasa.org> writes: > The attribute list is different now and there's no __dict__ and the > object does not accept new attributes. > Please explain what's going on.
It's a leaky abstraction, unfortunately. By default, all user-defined types will provide their instances with a ‘__dict__’ attribute, whic is a mapping to store the instance's attributes. But some types don't have that, and ‘object’ is one of them. It deliberately overrides the default behaviour, and has no ‘__dict__’ for its instances. >>> foo = object() >>> foo.bar = "spam" Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute 'bar' >>> foo.__dict__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute '__dict__' Your user-defined types, even though they inherit from ‘object’, will get a ‘__dict__’ as normal:: >>> class Bag: >>> """ A simple type to hold attributes. """ >>> Bag.__mro__ (<class '__main__.Bag'>, <class 'object'>) >>> foo = Bag() >>> foo.bar = "spam" >>> foo.__dict__ {'bar': 'spam'} See the discussion of ‘__slots__’, and note also that it's not recommended to use this unless you know exactly why you need it <URL:https://docs.python.org/3/reference/datamodel.html#slots>. I consider it a wart of Python that its ‘object’ instances lack the ability to gain arbitrary attributes in the way you expect. -- \ “Every man would like to be God, if it were possible; some few | `\ find it difficult to admit the impossibility.” —Bertrand | _o__) Russell, _Power: A New Social Analysis_, 1938 | Ben Finney -- https://mail.python.org/mailman/listinfo/python-list