为什么从dict派生的类不包含键

时间:2014-04-15 17:18:59

标签: python dictionary derived-class

使用此代码:

    class MyDict(dict):
        def __setitem__(self, k, v):
            print 'assignment', k, v
            self.__dict__[k] = v

    nsg = MyDict()
    nsg["b"] = 123
    print "G is: ", nsg

打印

assignment b 123
G is: {}

如果我添加

def __str__(self):
    return self.__dict__.__str__()

它有效:

assignment b 123
G is:  {'b': 123}

同样,如果我打印G["b"],我会收到KeyError,除非__getitem__(self)返回self.__dict__[k]

为什么不会自动找到父类dict,如__str____getitem__

1 个答案:

答案 0 :(得分:4)

dict对象不会在__dict__属性中存储键和值;怎么可能呢,因为__dict__属性本身就是一个dict对象!

使用重写的__setitem__方法添加到字典中;最佳做法是使用super()查找原始方法:

class MyDict(dict):
    def __setitem__(self, k, v):
        print 'assignment', k, v
        super(MyDict, self).__setitem__(k, v)

您还可以使用未绑定的dict.__setitem__方法:

class MyDict(dict):
    def __setitem__(self, k, v):
        print 'assignment', k, v
        dict.__setitem__(self, k, v)

除了硬编码方法而不是自定义myDict类的len子类注入另一个中间__setitem__方法。