On Dec 23, 2015 7:00 AM, "Chris Angelico" <ros...@gmail.com> wrote: > On Wed, Dec 23, 2015 at 11:46 PM, Neal Becker <ndbeck...@gmail.com> wrote: > > Sometimes I want to collect attributes on an object. Usually I would make > > an empty class for this. But it seems unnecessarily verbose to do this. So > > I thought, why not just use an Object? But no, an instance of Object > > apparantly can't have an attribute. Is this intentional? > > Yes; there are other uses of object() that benefit from being > extremely compact. You can use types.SimpleNamespace for this job, or > you can create the empty class as you're describing. (Chances are you > can give the class a meaningful name anyway.)
Its more that if you give object() an instance dict, all objects inheriting from object (i.e., all of them) must have an instance dict, which would make __slots__ and its benefits impossible. Another cross-version option: >>> bag = type("AttrBag", (), {})() >>> bag.spam = 2 >>> bag.spam 2 You can even sneak in keyword arguments like SimpleNamespace supports by passing them in the namespace dict (the third argument): >>> bag = type("AttrBag", (), dict(spam=3))() >>> bag.spam 3 Of course, using this you lose easy access to the 'AttrBag' class, but in most cases you shouldn't need it. If you do, just make it a regular class as has been suggested, or save off a reference to the class before instantiating. No comments on how ugly this is, though :) -- Zach -- https://mail.python.org/mailman/listinfo/python-list