我是靠谱客的博主 沉静奇迹,最近开发中收集的这篇文章主要介绍python中super带参数_如何在python中使用一个参数的super(),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python函数对象为

descriptors,Python使用描述符协议将函数绑定到实例.这个过程产生一个绑定的方法.

绑定是当您调用方法时出现“magic”self参数,当您尝试将属性用作实例上的属性时,什么使属性对象自动调用方法.

当您尝试使用它来查找父类的方法时,带有两个参数的super()调用相同的描述符协议; super(Foo,self).bar()将遍历Foo父类,直到找到一个属性栏,如果这是一个描述符的对象,它将被绑定到自己.调用栏然后调用绑定方法,该方法又将调用self参数中的函数调用为bar(self).

要做到这一点,super()对象存储类(第一个参数)绑定的自变量,以及自身对象的类型作为属性:

>>> class Foo(object):

... def bar(self):

... return 'bar on Foo'

...

>>> class Spam(Foo):

... def bar(self):

... return 'bar on Spam'

...

>>> spam = Spam()

>>> super(Spam, spam)

, >

>>> super(Spam, spam).__thisclass__

>>> super(Spam, spam).__self_class__

>>> super(Spam, spam).__self__

查找属性时,会搜索__self_class__属性的__mro__属性,从__thisclass__的位置开始一个位置,结果被绑定.

只有一个参数的super()将会错过__self_class__和__self__属性,并且不能执行查找:

>>> super(Spam)

, NULL>

>>> super(Spam).__self_class__ is None

True

>>> super(Spam).__self__ is None

True

>>> super(Spam).bar

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'super' object has no attribute 'bar'

对象确实支持描述符协议,所以你可以绑定它,就像你可以绑定一个方法一样:

>>> super(Spam).__get__(spam, Spam)

, >

>>> super(Spam).__get__(spam, Spam).bar()

'bar on Foo'

这意味着您可以将这样的对象存储在类上,并使用它来遍历父方法:

>>> class Eggs(Spam):

... pass

...

>>> Eggs.parent = super(Eggs)

>>> eggs = Eggs()

>>> eggs.parent

, >

>>> eggs.parent.bar()

'bar on Spam'

最后

以上就是沉静奇迹为你收集整理的python中super带参数_如何在python中使用一个参数的super()的全部内容,希望文章能够帮你解决python中super带参数_如何在python中使用一个参数的super()所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部