记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!!!
正常的代码为什么会有这种事情呢,一定是电脑的问题 嗯!!!
老实照着书上敲
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__ 这样就正常了
深入研究
为什么正常代码还会出错呢?是谁下的毒。。。
- 先看看什么来头
help(super) # 查看下帮助
查资料才发现只有继承object的类才能用super,而super 第一个参数是type,这家伙是classobj,跟上面的错误信息对上了。
而且这个类什么都没有继承??!找源码看看!!!
它是”传统类“这家伙真的是什么都没继承,自成一类。。。
这也就解释了为什么显式调用管用了
查资料发现了另一种解决方案:
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老祖。