欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记python2环境下UserDict一次bug

程序员文章站 2022-03-23 12:54:55
...

背景:学习python标准库(环境python2.7.12)

为了兼容后边学习的python3这样写:

class FancyDict(UserDict.UserDict):
    def __init__(self, data={}, **kw):
        super(FancyDict, self).__init__(self)
        self.update(data)
        self.update(kw)
    def __add__(self, other):
        dict = FancyDict(self.data)
        dict.update(b)
        return dict

照常理很正常的代码,对吧,but, A bug shoot me!!!

记python2环境下UserDict一次bug

正常的代码为什么会有这种事情呢,一定是电脑的问题 嗯!!!
老实照着书上敲

class FancyDict(UserDict.UserDict):
    def __init__(self, data={}, **kw):
        UserDict.UserDict.__init__(self)  # 这里不同
        self.update(data)
        self.update(kw)
    def __add__(self, other):
        dict = FancyDict(self.data)
        dict.update(b)
        return dict

显式的调用了父类的__init__ 这样就正常了

深入研究

为什么正常代码还会出错呢?是谁下的毒。。。

  • 先看看什么来头
    记python2环境下UserDict一次bug
help(super)  # 查看下帮助

查资料才发现只有继承object的类才能用super,而super 第一个参数是type,这家伙是classobj,跟上面的错误信息对上了。

而且这个类什么都没有继承??!找源码看看!!!

记python2环境下UserDict一次bug

它是”传统类“这家伙真的是什么都没继承,自成一类。。。
这也就解释了为什么显式调用管用了

查资料发现了另一种解决方案:

class FancyDict(UserDict.UserDict, object):  # 这里不同,再加上object
    def __init__(self, data={}, **kw):
        super(FancyDict, self).__init__(self)
        self.update(data)
        self.update(kw)
    def __add__(self, other):
        dict = FancyDict(self.data)
        dict.update(b)
        return dict

这个类干嘛用的?简单的用”+”法连接两个dict….

总结: py2中用super得继承object老祖。

相关标签: bug