Skip to content

Instantly share code, notes, and snippets.

@messense
Created April 12, 2014 03:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save messense/10517540 to your computer and use it in GitHub Desktop.
Save messense/10517540 to your computer and use it in GitHub Desktop.
Python ObjectDict
class ObjectDict(dict):
def __getattr__(self, key):
if key in self:
return self[key]
return None
def __setattr__(self, key, value):
self[key] = value
@zionb
Copy link

zionb commented Jan 29, 2017

The next code works for nested dict too!

class ObjectDict(dict):
    def __init__(self, dict_input):
        for k,v in dict_input.iteritems():
            if isinstance(v,dict):
                v = ObjectDict(v)
            self[k] = v

    def __getattr__(self, name):
        if name in self:
            return self[name]
        else:
            raise AttributeError("No such attribute: " + name)

    def __setattr__(self, name, value):
        self[name] = value

    def __delattr__(self, name):
        if name in self:
            del self[name]
        else:
            raise AttributeError("No such attribute: " + name)

@quxiaolong1504
Copy link

quxiaolong1504 commented Jan 25, 2018

class ObjectDict(dict):
    def __init__(self, dict_input):
        for k, v in dict_input.iteritems():
            if isinstance(v, dict):
                v = ObjectDict(v)
            if isinstance(v, list):
                v = [ObjectDict(sv) for sv in v]
            self[k] = v

    def __getattr__(self, name):
        if name in self:
            return self[name]
        else:
            raise AttributeError("No such attribute: " + name)

    def __setattr__(self, name, value):
        self[name] = value

    def __delattr__(self, name):
        if name in self:
            del self[name]
        else:
            raise AttributeError("No such attribute: " + name)

@alingse
Copy link

alingse commented Oct 1, 2020

x = {'a': [1, 2, 3], 'b': {'c': 2}}  

class ObjectDict(dict):

    def __getattr__(self, name):
        try:
            return self[name]
        except KeyError:
            raise AttributeError(name)

    def __setattr__(self, name, value):
        self[name] = value

    def __delattr__(self, name):
        del self[name]

def format_object(data):
    if isinstance(data, dict):
        return ObjectDict({
            k: format_object(v)
            for k, v in data.items()
        })
    elif isinstance(data, list):
        return [format_object(v) for v in data]
    else:
        return data

y = format_object(x)
assert y.a[0] == 1
assert y.b.c == 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment