概述
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()所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复