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

Python 为什么从dict派生的类不显示包含键,python,dictionary,derived-class,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__

使用此代码:

    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”]
我会得到一个键错误,除非
\uu getitem\uuuuuuuuuu(self)
返回
self.\uuuu dict\uuuuk]


为什么父类,
dict
,比如
\uuuu str\uuuu
\uuu getitem\uuuu
,没有自动找到

A
dict
对象不在
\uuuu dict\uuu
属性中存储键和值;它怎么可能,因为
\uuu dict\uu
属性本身就是一个
dict
对象

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

class MyDict(dict):
    def __setitem__(self, k, v):
        print 'assignment', k, v
        super(MyDict, self).__setitem__(k, v)
您也可以使用unbound
dict.\uuuu setitem\uuuu
方法:

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

除此之外,将对方法进行硬编码,而不是将自定义的
myDict
类的len子类注入另一个中介
\uuuuuu setitem\uuuuu
方法;它怎么可能,因为
\uuu dict\uu
属性本身就是一个
dict
对象

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

class MyDict(dict):
    def __setitem__(self, k, v):
        print 'assignment', k, v
        super(MyDict, self).__setitem__(k, v)
您也可以使用unbound
dict.\uuuu setitem\uuuu
方法:

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

除此之外,将硬编码方法,而不是自定义的
myDict
类的len子类注入另一个中介
\uuuuuuu setitem\uuuuu
方法。

工作得很好。这意味着,
dict
有一个
\uuuuu dict\uuuuuu
(因为在抛出和
print self中没有异常.\uuuuu dict\uuuuu
打印“{}”),但不使用它。。。奇怪的在任何情况下,使用您的技术,键-值对都会添加到dict本身(而不是
\uuuuuuuuuuuuuuuuu
),因此无需定义所有其他方法(
\uuuuuu str\uuuuuuuuuuuuuuuuuu
\uuuuuuuuuuu getitem\uuuuuuuuuuuuuuu
等)。您的子类有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,因为它是一个自定义类。这意味着,
dict
有一个
\uuuuu dict\uuuuuu
(因为在抛出和
print self中没有异常.\uuuuu dict\uuuuu
打印“{}”),但不使用它。。。奇怪的在任何情况下,使用您的技术,键-值对都会添加到dict本身(而不是
\uuuuuu dict\uuuu
),因此无需定义所有其他方法(
\uuuu str\uuuuu
\uuuu getitem\uuuuuuuu
等)。您的子类有一个
\uuu dict\uuuu
,因为它是一个自定义类,并且不使用
\uuuuuu>插槽。