A python class that acts like dict

前端 未结 9 2062

I want to write a custom class that behaves like dict - so, I am inheriting from dict.

My question, though, is: Do I need to create a priva

相关标签:
9条回答
  • 2020-11-30 18:34

    I really don't see the right answer to this anywhere

    class MyClass(dict):
        
        def __init__(self, a_property):
            self[a_property] = a_property
    

    All you are really having to do is define your own __init__ - that really is all that there is too it.

    Another example (little more complex):

    class MyClass(dict):
    
        def __init__(self, planet):
            self[planet] = planet
            info = self.do_something_that_returns_a_dict()
            if info:
                for k, v in info.items():
                    self[k] = v
    
        def do_something_that_returns_a_dict(self):
            return {"mercury": "venus", "mars": "jupiter"}
    

    This last example is handy when you want to embed some kind of logic.

    Anyway... in short class GiveYourClassAName(dict) is enough to make your class act like a dict. Any dict operation you do on self will be just like a regular dict.

    0 讨论(0)
  • 2020-11-30 18:35

    Don’t inherit from Python built-in dict, ever! for example update method woldn't use __setitem__, they do a lot for optimization. Use UserDict.

    from collections import UserDict
    
    class MyDict(UserDict):
        def __delitem__(self, key):
            pass
        def __setitem__(self, key, value):
            pass
    
    0 讨论(0)
  • 2020-11-30 18:40
    class Mapping(dict):
    
        def __setitem__(self, key, item):
            self.__dict__[key] = item
    
        def __getitem__(self, key):
            return self.__dict__[key]
    
        def __repr__(self):
            return repr(self.__dict__)
    
        def __len__(self):
            return len(self.__dict__)
    
        def __delitem__(self, key):
            del self.__dict__[key]
    
        def clear(self):
            return self.__dict__.clear()
    
        def copy(self):
            return self.__dict__.copy()
    
        def has_key(self, k):
            return k in self.__dict__
    
        def update(self, *args, **kwargs):
            return self.__dict__.update(*args, **kwargs)
    
        def keys(self):
            return self.__dict__.keys()
    
        def values(self):
            return self.__dict__.values()
    
        def items(self):
            return self.__dict__.items()
    
        def pop(self, *args):
            return self.__dict__.pop(*args)
    
        def __cmp__(self, dict_):
            return self.__cmp__(self.__dict__, dict_)
    
        def __contains__(self, item):
            return item in self.__dict__
    
        def __iter__(self):
            return iter(self.__dict__)
    
        def __unicode__(self):
            return unicode(repr(self.__dict__))
    
    
    o = Mapping()
    o.foo = "bar"
    o['lumberjack'] = 'foo'
    o.update({'a': 'b'}, c=44)
    print 'lumberjack' in o
    print o
    
    In [187]: run mapping.py
    True
    {'a': 'b', 'lumberjack': 'foo', 'foo': 'bar', 'c': 44}
    
    0 讨论(0)
提交回复
热议问题