大家好,我是Jiejie,今天我将介绍一种非常神秘的魔术方法。
该方法非常不起眼和狭窄。我从未注意到。但是,当我发现这可能是上述“法律”的唯一例外时,我认为值得写一篇文章以详细检查。
本文的主要关注点是:
(1)__________()神圣在哪里?
(2)____________________________。
(3)___________________。
当值取自普通词典时,关键不存在:
对于get()方法,它具有返回值,并且可以传递到第二个参数中。作为不存在的返回内容,它是可以接受的。但是,其他两种写作方法将报告错误。
为了解决后两种方法的问题,您可以使用____________________________。
现在,假设我们有这样的需求:取一个与字典中键相对应的值。如果有一个值,则如果没有值,则插入返回值,并且给出默认值(例如一个空列表)。
如果您使用本地dict,则不容易实现,但是Python提供了非常有用的扩展类集合。DefaultDict:
如图所示,当采用非存在的键时,未报告键的键,但默认情况下将其存储在字典中。
为什么违约行为可以这样做?
原因是,在继承了构建的类型dict之后,默认数据也定义了__________________________________________部和方法。当__getItem__不存在时,它将调用参数中引入的出厂功能(上面的示例称为列表呼叫列表(),创建一个空列表)。
作为最典型的示例,DefaultDict在文档评论中写道:
简而言之,__缺少__()的主要角色是在缺少密钥时通过__getItem__呼叫,以避免键。
使用的另一个典型示例是Collections.Counter,这也是dict的子类。服用无限键时,返回计数0:
从上面可以看出,当__getItem __()不可用时,__丢失的__()将被调用。但是,我无意中找到了一个细节:__ getItem __()to。
这是因为它不是构建类型的必要属性,并且在字典基类中未定义。
如果您直接从dict类型中获取属性值,则它将不存在:attributerror:type对象'对象'没有属性'__ missing__'。
使用dir()查看,发现没有这样的属性:
如果您从dict的父类中查看它,即是对象,也会找到相同的结果。
但是,检查最新的官方文档,对象显然包含以下属性:
资料来源:https://docs.python.org/3/reference/datamodel.html?亮点= __缺少__#对象。
换句话说,从理论上讲,在理论上证明了这一点,这证明了这一点,但实际上并未定义!文档偏离现实!
这样,当dict的子类(例如违约和乡村)定义__Missing__时,这种魔术方法实际上属于子类,也就是说,这是子类中出生的魔法方法!
基于此,我有一个不成熟的猜想:__ getItitem __()将确定当前对象是否是dict的子类,以及它是否具有_______________________________________________。
我说在交流小组中的猜想。一些同学很快在CPYTHON源代码中找到了验证:
这很有趣。构建子类中存在的魔术方法。看着整个Python世界,恐怕很难找到第二种情况。
我突然建立了一个协会:这个神是鬼__(),就像一个魔术师一样擅长玩“大变化”,首先让观众通过外面的玻璃杯看(即官方文件),但揭幕开口,但揭开了它的开口。在门上,他不在里面(即建造的类型),然后更改道具,然后他看起来完好无损(即dict的子类)。
______________________________________________________________________。
在上一篇文章中,我发现本机魔术方法彼此独立。它们在C语言界面中可能具有相同的核心逻辑,但是在Python语言界面中,没有呼叫关系:
这种魔术方法的“古老死亡”的表现违反了代码重用的原则,也是某些奇怪表演的原因,导致建筑 - 在子类中。
官方的Python宁愿提供新的用户播放,用户列表和用户数据子类,并且他们不愿意重复使用魔术方法。唯一合理的解释似乎是魔术方法被称为太多的价格。
但是,对于__________________________________________________________________________________________。
__ __()是魔术方法的“第二个公民”。它没有独立的呼叫入口。它只能从__getItem __()被动地调用,即__ __()取决于__getItem __()。
与“第一个阶级公民”不同,例如__init __(),__enter __(),__ len __(),__ eq __()等。,没有依赖。
__()__()依靠__getItem __()实现方法调用;__getItem __()也取决于__ ____________________就是实现完整的功能。
为此,__ getItitem __()在解释器代码中打开后门,并将python接口从C语言接口返回,以调用称为“ __ Missing__”的特定方法。
这是真正的“魔术”。到目前为止,__缺少__()似乎是享受这些治疗方法的唯一神奇方法!
Python词典为值提供了两个构建的方法,即__getItem __()和get()。当该值不存在时,其处理策略是不同的:前者将报告KeyError的错误,而后者将不返回。
为什么Python提供两种不同的方法?或者我应该问,为什么Python为不同的治疗方法做这两种方法?
这可能具有非常复杂(或非常简单)的解释。本文暂时不会进行调查。
但是一个一点是可以肯定的:本地dict类型很简单,粗鲁地投掷keyError。
为了使字典类型更强大(或令__getItem __()使诸如get())之类的性能,python允许字典子类定义______________tiTem __()查找和调用。
相反,这是唯一打破魔法方法并支持其他魔法方法的特殊情况!
为了保持魔法方法的独立性,Python艰苦地引入了用户播放,用户列表和用户,但是对于__Missing __(),它选择了妥协。
本文揭示了这种魔术方法的奥秘。我想知道您阅读后的感觉吗?欢迎留言进行讨论。