python – How can I create an object and add attributes to it?

python – How can I create an object and add attributes to it?

The built-in object can be instantiated but cant have any attributes set on it. (I wish it could, for this exact purpose.) It doesnt have a __dict__ to hold the attributes.

I generally just do this:

class Object(object):
    pass

a = Object()
a.somefield = somevalue

When I can, I give the Object class a more meaningful name, depending on what kind of data Im putting in it.

Some people do a different thing, where they use a sub-class of dict that allows attribute access to get at the keys. (d.key instead of d[key])

Edit: For the addition to your question, using setattr is fine. You just cant use setattr on object() instances.

params = [attr1, attr2, attr3]
for p in params:
    setattr(obj.a, p, value)

You could use my ancient Bunch recipe, but if you dont want to make a bunch class, a very simple one already exists in Python — all functions can have arbitrary attributes (including lambda functions). So, the following works:

obj = someobject
obj.a = lambda: None
setattr(obj.a, somefield, somevalue)

Whether the loss of clarity compared to the venerable Bunch recipe is OK, is a style decision I will of course leave up to you.

python – How can I create an object and add attributes to it?

There is types.SimpleNamespace class in Python 3.3+:

obj = someobject
obj.a = SimpleNamespace()
for p in params:
    setattr(obj.a, p, value)
# obj.a.attr1

collections.namedtuple, typing.NamedTuple could be used for immutable objects. PEP 557 — Data Classes suggests a mutable alternative.

For a richer functionality, you could try attrs package. See an example usage. pydantic may be worth a look too.

Leave a Reply

Your email address will not be published. Required fields are marked *