Python dictionary from an object's fields
Note that best practice in Python 2.7 is to use new-style classes (not needed with Python 3), i.e.
class Foo(object): ...
Also, there's a difference between an 'object' and a 'class'. To build a dictionary from an arbitrary object, it's sufficient to use __dict__
. Usually, you'll declare your methods at class level and your attributes at instance level, so __dict__
should be fine. For example:
>>> class A(object):... def __init__(self):... self.b = 1... self.c = 2... def do_nothing(self):... pass...>>> a = A()>>> a.__dict__{'c': 2, 'b': 1}
A better approach (suggested by robert in comments) is the builtin vars
function:
>>> vars(a){'c': 2, 'b': 1}
Alternatively, depending on what you want to do, it might be nice to inherit from dict
. Then your class is already a dictionary, and if you want you can override getattr
and/or setattr
to call through and set the dict. For example:
class Foo(dict): def __init__(self): pass def __getattr__(self, attr): return self[attr] # etc...
Instead of x.__dict__
, it's actually more pythonic to use vars(x)
.
The dir
builtin will give you all the object's attributes, including special methods like __str__
, __dict__
and a whole bunch of others which you probably don't want. But you can do something like:
>>> class Foo(object):... bar = 'hello'... baz = 'world'...>>> f = Foo()>>> [name for name in dir(f) if not name.startswith('__')][ 'bar', 'baz' ]>>> dict((name, getattr(f, name)) for name in dir(f) if not name.startswith('__')) { 'bar': 'hello', 'baz': 'world' }
So can extend this to only return data attributes and not methods, by defining your props
function like this:
import inspectdef props(obj): pr = {} for name in dir(obj): value = getattr(obj, name) if not name.startswith('__') and not inspect.ismethod(value): pr[name] = value return pr