Create an anonymous class instance in python Create an anonymous class instance in python python python

Create an anonymous class instance in python


o = type('Dummy', (object,), { "attr1": "somehing", "attr2": 344 })
o.attr3 = "test"print o.attr1, o.attr2, o.attr3


type

while this is not precisely a single statement I think creating a wrapper around the magic of the accepted answer makes it by far more readable.

import inspect # wrap the type call around a function # use kwargs to allow named function argumentsdef create_type(name, **kwargs):    return type(name, (object,), kwargs)# example call to make a structurep = create_type('foobar', xxx='barfoo', seti=0)assert p.xxx == 'barfoo'assert p.seti == 0print inspect.getmembers(p)

Output

[('__class__', <type 'type'>), ('__delattr__', <slot wrapper '__delattr__' of 'object' objects>), ('__dict__', <dictproxy object at 0x9a5050>), ('__doc__', None), ('__format__', <method '__format__' of 'object' objects>), ('__getattribute__', <slot wrapper '__getattribute__' of 'object' objects>), ('__hash__', <slot wrapper '__hash__' of 'object' objects>), ('__init__', <slot wrapper '__init__' of 'object' objects>), ('__module__', '__main__'), ('__new__', <built-in method __new__ of type object at 0x399c578460>), ('__reduce__', <method '__reduce__' of 'object' objects>), ('__reduce_ex__', <method '__reduce_ex__' of 'object' objects>), ('__repr__', <slot wrapper '__repr__' of 'object' objects>), ('__setattr__', <slot wrapper '__setattr__' of 'object' objects>), ('__sizeof__', <method '__sizeof__' of 'object' objects>), ('__str__', <slot wrapper '__str__' of 'object' objects>), ('__subclasshook__', <built-in method __subclasshook__ of type object at 0x919370>), ('__weakref__', <attribute '__weakref__' of 'foobar' objects>), # here they are ('seti', 0), ('xxx', 'barfoo')]

namedtuple

from collections import namedtupled = { 'a' : 'foo', 'b' : 'bar' }foobar = namedtuple('foobar', d.keys())(**d)print foobar

Output

Python 2.7.5 (default, May 30 2013, 16:55:57) [GCC] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> from collections import namedtuple>>> d  =  { 'a' : 'foo', 'b' : 'bar' }>>> foobar = namedtuple('foobar', d.keys())(**d)>>> print foobarfoobar(a='foo', b='bar')>>> 


If you are using Python 3.3 or later, you can use types.SimpleNamespace:

from types import SimpleNamespaceo = SimpleNamespace(attr1="something", attr2=344)print(o)# namespace(attr1='something', attr2=344)