Python super函数,python里的super什么意思

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: