Python super函数,python里的super什么意思
经常有朋友问,学习Python面向对象的时候,你会在翻别人代码的时候发现一个super()函数。这个函数的作用是什么?
本文由梦橡皮擦分享自华为云社区《Python中的super函数怎么学,怎么解?》。
实战中经常有朋友问,在学习Python面向对象的时候,你会在浏览别人代码的时候发现一个super()函数。这个函数的作用是什么?
super()函数的用法如下:调用子类中父类的方法,多用于类的继承关系。
其语法格式如下:
super(type[,object-or-type])参数描述如下:
Type: class,可选参数object-or-type:对象或类,通常是self,也是可选参数。返回值是一个代理对象。
可以直接查询官方帮助手册:
帮助(超级)输出信息如下:
关于模块内置类super的帮助:
超类(对象)
super() -与super(__class__,第一个参数)相同
超级(类型)-未绑定的超级对象
super(type,obj)绑定的超级对象;需要isinstance(obj,type)
super(type,type2)绑定的超级对象;需要issubclass(类型2,类型)
调用协作超类方法的典型用法:
丙类(乙类):
def meth(self,arg):
超级()。甲基苯丙胺(阿根廷)
这也适用于类方法:
丙类(乙类):
@classmethod
def cmeth(cls,arg):
超级()。cmeth(arg)分析输出结果后,我们可以得到以下结论:
超类是从object继承的类,Super()函数是这个类的实例化;调用super()实例化后,返回一个超级对象;super()参数有四种组合。有关详细信息,请参见上面的输出。实战中用代码单继承直接看单继承相关的代码,其中用类名调用父类方法。
A类:
def付娜(自我):
打印(执行A,输出橡皮擦)
B(A)类:
def funB(自身):
# self表示b类的实例。
a .富纳(自我)
打印(执行B,输出铅笔)
b=B()
B.funB()上面的代码在B类中添加了funB函数,在a类中调用了付娜函数,此时输出内容如下:
一、输出橡皮擦
b,输出铅笔。如果将上面的代码修改为super()函数来调用父类方法,可以使用下面的代码:
A类:
def付娜(自我):
打印(执行A,输出橡皮擦)
B(A)类:
def funB(自身):
#注意super()函数的用法
超级()。付娜()
打印(执行B,输出铅笔)
b=B()
B.funB()以上代码与之前运行结果一致。在单继承的层次结构中,super可以直接引用父类,即在子类中,不需要使用父类名来调用父类方法,而是使用代理对象(super object)来调用。这样做的好处是,当父类名改变或者继承关系改变时,我们不需要反复修改调用。
我们来看看多重继承情况下super()函数的实际场景。
A类:
定义运行(自身):
打印( AAA )
B类:
定义运行(自身):
打印(“BBB”)
C类:
定义运行(自身):
打印(“抄送”)
D类(甲、乙、丙类):
定义运行(自身):
超级()。运行()
d=D()
D.run()此时的输出结果是AAA。可以看出,super匹配的数据是A类中的run函数,也就是最左边类中的方法。在这里,修改各个类中运行函数的名称,使它们不同。
A类:
定义运行1(自身):
打印( AAA )
B类:
定义运行2(自身):
打印(“BBB”)
C类:
def run3(自身):
打印(“抄送”)
D类(甲、乙、丙类):
定义运行(自身):
#调用b中的run2
超级()run2()
d=D()
D.run()当一个类继承多个类时,如果第一个父类中没有提供该方法,则当前类实例将向上搜索__mro__属性。如果没有在object类中检索到该方法,将引发AttributeError异常。
基于以上逻辑,我们可以对其进行扩展,使用super()函数中的参数。
A类:
定义运行(自身):
打印( AAA )
B类:
定义运行(自身):
打印(“BBB”)
C类:
定义运行(自身):
打印(“抄送”)
D类(甲、乙、丙类):
定义运行(自身):
#调用C语言运行
超级(B,自我)。运行()
d=D()
D.run()此时的输出结果是CCC,表示使用super函数后,可以使用super (class,self)指定以哪个类为起点来搜索父类中的方法。上面代码设置的B表示从B开始搜索,然后找到C类,C类包含run()方法,所以输出CCC。
__mro__属性的说明。
MRO是方法解析顺序,即方法解析顺序,其本质是继承父方法时的顺序表。
在Python中,可以使用内置属性__mro__查看方法的搜索顺序,比如下面的代码,重点是输出部分。
A类:
定义运行(自身):
打印( AAA )
B类:
定义运行(自身):
打印(“BBB”)
C类:
定义运行(自身):
打印(“抄送”)
D类(甲、乙、丙类):
定义运行(自身):
#调用C语言运行
超级(B,自我)。运行()
print(D.__mro__)输出的结果如下:
(class _ _ main _ _。d ,类 _ _ main _ _。a ,class _ _ main _ _。 b ,class _ _ main _ _。c ,class object )可以修改继承顺序,得到不同的输出结果。
(class _ _ main _ _。d ,类 _ _ main _ _。a ,class _ _ main _ _。c ,class _ _ main _ _。b ,class object )当搜索一个方法时,它基于__mro__的输出结果
A.找到一个方法,停止寻找;
B.如果没有找到,继续搜索下一个类别;
C.如果最后没有找到,程序会报错。
第一时间点击了解华为云鲜技术~
原创作品来自华为云开发者联盟,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。