pythonsuper原理_python – `__new__`中的`super()`是什么?

以super()开头本身就是super(A,B)的简写,其中A是代码出现的类,B是代码出现的函数的第一个参数;所以在你的特殊情况下,super().__ new __(cls)扩展为super(CarModel,cls).__ new __(cls).

反过来,super(T,O)返回“超级对象”.要了解超级对象的作用,您需要了解实例和类的属性引用如何在Python中工作.

假设不涉及__getattr__或__getattribute__方法,则在对象O上引用属性A(即,评估O.A或getattr(O,“A”))继续执行以下步骤:

>如果在O的实例dict(O .__ dict__)中定义了“A”,那么该dict上的值将直接返回,就像它一样.

>否则,依次检查O的方法解析顺序中的每个类,在每个单词中查找“A”.如果找到,请调用值D.

>如果D反过来没有定义__get__,那么它会按原样返回.但是,如果确实如此,那么D被称为“描述符”,并且以_作为第一个参数调用其__get__方法,并键入(O)作为第二个参数.

类的属性引用大致相同,用实例引用的类替换,但有以下区别:

>第1步不适用.

>使用None作为第一个参数调用__get__方法,并将类引用为第二个参数.

Python使用描述符来实现诸如实例方法,类方法,静态方法和属性之类的东西.

用super(T,O)创建的超级对象是一个(内置)对象,它有一个__getattribute__方法,在它上面的每个属性引用上调用,并查找T之后唯一类的dicts中的属性.在O的MRO.然后它找到的值,它像往常一样调用__get__.

这个过程有点复杂,所以作为一个例子,这里是它如何适用于您的具体情况.由于CarModel是按原样定义的,因此它的MRO是[CarModel,object].

> super().__ new __(cls)扩展为super(CarModel,cls).__ new __(cls),如上所述.

> super(CarModel,cls)被评估以产生超级对象S.

> Python在S上获取属性“__new__”(相当于在Python代码中调用getattr(S,“__ new__”)).

>由于S是在CarModel类上创建的,因此它会在CarModel的MRO中考虑CarModel之后的类,并在对象类本身的dict中找到“__new__”.它的值是一个静态方法,它有一个__get__方法,用参数None和cls调用.由于__new__是一个静态方法,因此它的__get__方法只是原封不动地返回函数.因此,super(CarModel,cls).__ new__与object .__ new__完全相同.

>使用cls参数调用在最后一步中获得的函数(即object .__ new__),其中cls可能是CarModel,最后是CarModel类的新实例.

我希望这完全可以理解.

(为了完整起见,应该提到对象类的实际__new__函数实际上不是静态方法,而是一个根本没有__get__方法的特殊内置函数,但是因为静态的__get__方法方法只返回它们定义的函数,效果是一样的.)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值