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

为什么类方法的超级需要第二个参数?

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

为什么类方法的超级需要第二个参数?

super()
返回一个描述符,并且需要两项:

  • 搜索类层次结构的起点。
  • 绑定 返回方法的参数。

对于两个参数(和隐式零参数*),第二个参数用于绑定,但是如果不传递第二个参数,

super()
则无法调用描述符协议来绑定返回的函数,类方法,属性或其他描述符。
classmethods
仍然是描述符并已绑定;绑定到类而不是实例,但是
super()

不知道 描述符将如何使用绑定到的上下文。

super()
不应并且不知道您正在查找的是类方法而不是常规方法;类方法仅与常规方法不同,因为它们的
.__get__()
方法行为不同。

为什么要绑定类方法?因为当您继承子类

Foo

重写时
.hello()
,调用会
Bar.hello()
调用该
Foo.__dict__['hello']
函数,并将其绑定到,
Bar
并且您的第一个参数
hello(cls)
将是该子类,而不是
Foo

如果没有第二个参数,则

super()
返回一个未绑定的对象,以后可以手动对其进行绑定。您可以使用实例
.__get__()
提供的方法自己进行绑定
super()

class Bar(Foo):    @classmethod    def hello(cls):        print 'hello, bar'        super(Bar).__get__(cls, None).hello()

super().__get__()
在没有上下文的实例上有效地返回具有上下文集的新
super()
实例。在具有上下文的实例上
.__get__()
返回
self
;
它已经绑定。


*在Python 3中,

super()
从绑定方法内部不带参数的调用将使用调用框架隐式地发现类型和绑定对象是什么,因此在这种情况下,您不再需要显式传递类型和对象参数。
__class__
为此,Python 3实际上向方法添加了一个隐式闭包变量。请参阅PEP 3135,为什么Python 3.x的super()有魔力?



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

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

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