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'

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值