当前位置: 首页 > 网络应用技术

Python中最神秘的魔术功能之一!

时间:2023-03-09 11:57:50 网络应用技术

  大家好,我是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 __(),它选择了妥协。

  本文揭示了这种魔术方法的奥秘。我想知道您阅读后的感觉吗?欢迎留言进行讨论。