栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Python 3.x的super()有魔力?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Python 3.x的super()有魔力?

super()
添加了新的魔术行为,以避免违反DRY(请勿重复自己)原理,请参阅PEP 3135。必须通过将其引用为全局来显式地命名该类,这也容易产生与你自己发现的相同的重新绑定问题
super()

class Foo(Bar):    def baz(self):        return super(Foo, self).baz() + 42Spam = FooFoo = something_else()Spam().baz()  # liable to blow up

对于使用类装饰器的情况也是如此,其中装饰器返回一个新对象,该对象重新绑定了类名:

@class_decorator_returning_new_classclass Foo(Bar):    def baz(self):        # Now `Foo` is a *different class*        return super(Foo, self).baz() + 42

魔术

super() __class__
单元使你可以访问原始类对象,从而很好地避开了这些问题。

PEP由

Guido
发起,他最初设想
super
成为关键字,并且使用单元格查找当前班级的想法也是他的想法。当然,使其成为关键字的想法是PEP初稿的一部分。

但是,实际上是

Guido
自己才放弃了“太不可思议”的关键字概念,而是提出了当前的实现方式。他预计使用其他名称
super()
可能会出现问题:

我的补丁使用了一种中间解决方案:假定你

__class__
每次使用名为的变量时都需要使用
'super'
。因此,如果你(全局)重新命名super,以supper和使用supper,但不能super,也不会不带参数的工作(但它仍然可以工作,如果你通过它要么
__class__
或实际的类对象); 如果你有一个名为的不相关变量super,那么一切都会起作用,但是该方法将使用稍慢一些的用于单元变量的调用路径。

因此,最终,Guido自己宣布使用super关键字感觉不正确,并且提供一个魔术

__class__
单元是可以接受的折衷方案。

我同意该实现的神奇的,隐式的行为有些令人惊讶,但它super()是该语言中最常被错误使用的功能之一。只需看看 Internet上所有被误用

super(type(self), self)
super(self.__class__, self)
调用的内容;如果从派生类调用了任何代码,最终都会遇到无限递归异常。至少super()没有参数的简化调用可以避免该问题。

至于更名

super_
; 刚才提到
__class__
你的方法,以及它会重新工作。如果你在方法中引用super 或
__class__
名称,则会创建该单元格:

>>> super_ = super>>> class A(object):...     def x(self):...         print("No flipping")... >>> class B(A):...     def x(self):...         __class__  # just referencing it is enough...         super_().x()... >>> B().x()No flipping


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/420253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号