How do I create objects on the fly in Python? I often want to pass information to my Django templates which is formatted like this:
{\'test\': [a1, a2, b2],
Use collections.namedtuple.
Here's a rogue, minimalist way to create an object. A class is an object, so just commandeer the class definition syntax as if it were a Python object literal:
class testobj(object):
test = [a1,a2,b2]
test2 = 'something else'
test3 = 1
Class variables are the members of the object, and are easily referenced:
assert testobj.test3 == 1
This is weird, a class never used as a class: it's never instantiated. But it's a low-clutter way to make an ad hoc, singleton object: The class itself is your object.
There is another solution in Python 3.3+ types.SimpleNamespace
from types import SimpleNamespace
test_obj = SimpleNamespace(a=1, b=lambda: {'hello': 42})
test_obj.a
test_obj.b()
use building function type: document
>>> class X:
... a = 1
...
>>> X = type('X', (object,), dict(a=1))
first and second X are identical
In Django templates, the dot notation (testobj.test
) can resolve to the Python's []
operator. This means that all you need is an ordinary dict:
testobj = {'test':[a1,a2,b2], 'test2':'something else', 'test3':1}
Pass it as testobj
variable to your template and you can freely use {{ testobj.test }}
and similar expressions inside your template. They will be translated to testobj['test']
. No dedicated class is needed here.
The code below also require a class to be created however it is shorter:
>>>d = {'test':['a1','a2','b2'], 'test2':'something else', 'test3':1}
>>> class Test(object):
... def __init__(self):
... self.__dict__.update(d)
>>> a = Test()
>>> a.test
['a1', 'a2', 'b2']
>>> a.test2
'something else'