A python class that acts like dict

前端 未结 9 2061

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:19

    Like this

    class CustomDictOne(dict):
       def __init__(self,*arg,**kw):
          super(CustomDictOne, self).__init__(*arg, **kw)
    

    Now you can use the built-in functions, like dict.get() as self.get().

    You do not need to wrap a hidden self._dict. Your class already is a dict.

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

    Here is an alternative solution:

    class AttrDict(dict):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.__dict__ = self
    
    a = AttrDict()
    a.a = 1
    a.b = 2
    
    0 讨论(0)
  • 2020-11-30 18:22

    Check the documentation on emulating container types. In your case, the first parameter to add should be self.

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

    The problem with this chunk of code:

    class myDict(dict):
        def __init__(self):
            self._dict = {}
    
        def add(id, val):
            self._dict[id] = val
    
    
    md = myDict()
    md.add('id', 123)
    

    ...is that your 'add' method (...and any method you want to be a member of a class) needs to have an explicit 'self' declared as its first argument, like:

    def add(self, 'id', 23):
    

    To implement the operator overloading to access items by key, look in the docs for the magic methods __getitem__ and __setitem__.

    Note that because Python uses Duck Typing, there may actually be no reason to derive your custom dict class from the language's dict class -- without knowing more about what you're trying to do (e.g, if you need to pass an instance of this class into some code someplace that will break unless isinstance(MyDict(), dict) == True), you may be better off just implementing the API that makes your class sufficiently dict-like and stopping there.

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

    A python class that acts like dict

    By request - adding slots to a dict subclass.

    Why add slots? A builtin dict instance doesn't have arbitrary attributes:

    >>> d = dict()
    >>> d.foo = 'bar'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'dict' object has no attribute 'foo'
    

    So, let's create a subclass the way most are doing it here on this answer:

    my_dict(dict):
        """my subclass of dict""" 
    
    md = my_dict()
    md.foo = 'bar'
    

    Since there's no error created by the above, the above class doesn't actually act, "like dict."

    We can make it act like dict by giving it empty slots:

    class my_dict(dict):
        __slots__ = ()
    
    md = my_dict()
    

    So now attempting to use arbitrary attributes will fail:

    >>> md.foo = 'bar'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'my_dict' object has no attribute 'foo'
    

    And this Python class acts more like a dict.

    For more on how and why to use slots, see this Q&A: Usage of __slots__?

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

    This is my best solution. I used this many times.

    class DictLikeClass:
        ...
        def __getitem__(self, key):
            return getattr(self, key)
    
        def __setitem__(self, key, value):
            setattr(self, key, value)
        ...
    

    You can use like:

    >>> d = DictLikeClass()
    >>> d["key"] = "value"
    >>> print(d["key"])
    
    0 讨论(0)
提交回复
热议问题