首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >get和dunder的区别

get和dunder的区别
EN

Stack Overflow用户
提问于 2018-05-29 13:23:03
回答 2查看 2.8K关注 0票数 9

我正在阅读流利的Python,并试图加深对字典的理解。

因此,当我运行以下代码时,结果很容易理解,因为get()和dunder ()都返回相同的结果

代码语言:javascript
复制
sample = {'a':1, 'b':2}
print(sample.__getitem__('a')) # 1
print(sample.get('a')) # 1

当我用get()子类dict时,我得到一个工作实例

代码语言:javascript
复制
class MyDict(dict):
    def __missing__(self, key):
        return 0

    def get(self, key):
        return self[key]

d = MyDict(sample)
print(d['a']) # 1
print(d['c']) # 0

现在,如果我用()替换get(),我会得到一个错误,我不知道原因。

代码语言:javascript
复制
class MyDict2(dict):
    def __missing__(self, key):
        return 0

    def __getitem__(self, key):
        return self[key]

d = MyDict2(sample)
print(d['a'])
print(d['c'])

错误

代码语言:javascript
复制
RecursionError: maximum recursion depth exceeded while calling a Python object

所以问题是,在这种情况下,get和dunder有什么区别,为什么这会导致递归错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-29 13:27:04

这是因为self[key]MyDict2.__getitem__(key)中等价于(即调用) self.__getitem__(key) =>无限递归。

票数 5
EN

Stack Overflow用户

发布于 2018-05-29 13:27:11

在……里面

代码语言:javascript
复制
def __getitem__(self, key):
    return self[key]

self[key]称最低层__getitem__self[key] .无限递归

在:

代码语言:javascript
复制
def get(self, key):
    return self[key]

self[key]也调用最低级别的__getitem__,但是从dict类调用,所以它不能恢复:它可以工作(您只是重载了get方法,仅此而已)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50585532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档