Python super(),python中的super函数

  Python super(),python中的super函数

  

  一、单独调用父类的方法

  要求:写一个类,然后写一个子类来继承,用子类调用父类的方法1。

  方法一打印:胖老板,包槟榔。

  然后先写一个胖老板的父类,执行一下:

  类别父亲(对象):

  def __init__(self,name):

  Print(“父亲的init开始被调用”)

  self.name=name

  打印(父亲的名字是% s“% self . name”)

  打印(“父亲的初始化调用结束”)

  定义主():

  Ff=FatFather(胖老板的父亲)运行这个胖老板的父类的构造方法init如下:

  if __name__==__main__:

  主()

  父亲的init开始被调用。

  父亲的名字是胖老板的父亲。

  FatFather的init调用结束了,我们来写一个子类,也就是胖老板类,继承上面的类。

  #胖子老板的家长课

  类别父亲(对象):

  def __init__(self,name):

  Print(“父亲的init开始被调用”)

  self.name=name

  Print(调用父类的名称是%s% self.name )

  打印(“父亲的初始化调用结束”)

  #胖老板类继承了父亲类

  班级FatBoss(FatFather):

  def __init__(自己,名字,爱好):

  打印(‘胖老板的课叫!’)

  爱好=爱好

  父亲。_ _ init _ _ (self,name) #直接调用父类的构造函数。

  打印( %s爱好是%s% (name,self.hobby))

  定义主():

  #ff=FatFather(胖老板的父亲)

  Fatboss=FatBoss(胖老板,斗地主)。在上面的代码中,我使用FatFather.init(self,name)直接调用父类的方法。

  运行结果如下:

  if __name__==__main__:

  主()

  胖老板的课叫!

  父亲的init开始被调用。

  骂人的父亲级是胖老板。

  父亲的初始化调用结束。

  胖子的爱好是斗地主二、super() 方法基本概念.

  除了直接使用FatFather.init(self,name)的方法,还可以使用super()方法调用。

  那么首先你需要看一下super()方法的描述和语法,了解super()方法的用法。

  2.1 描述

  super()函数是用于调用父类(超类)的方法。

  Super用来解决多重继承的问题。使用单继承时用类名直接调用父类方法没问题,但如果使用多重继承,就会涉及到找序(MRO)、重复调用(钻石继承)等各种问题。

  MRO是一个类的方法解析序列表,实际上是继承父类方法时的序列表。

  相关:《Python视频教程》

  2.2 语法

  以下是super()方法3360的语法。

  超级(类型[,对象或类型])参数

  类型-类别

  对象或类型类,通常是自身

  Python3.x和Python2.x的一个区别是: Python 3可以直接使用super()。xxx而不是超(类,自我)。xxx3360。

  Python3.x的例子:

  克拉斯

  s A:

   pass

  class B(A):

   def add(self, x):

   super().add(x)Python2.x 实例:

  

class A(object): # Python2.x 记得继承 object

2.3 单继承使用super()

 

  使用super() 方法来改写刚才胖子老板继承父类的 init 构造方法

  

# 胖子老板的父类

从上面使用super方法的时候,因为是单继承,直接就可以使用了。

 

  运行如下:

  

if __name__ == "__main__":

那么为什么说单继承直接使用就可以呢?因为super()方法如果多继承的话,会涉及到一个MRO(继承父类方法时的顺序表) 的调用排序问题。

 

  下面可以打印一下看看单继承的MRO顺序(FatBoss.mro)。

  

# 胖子老板的父类

上面的代码使用 FatBoss.mro 可以打印出 FatBoss这个类经过 python解析器的 C3算法计算过后的继承调用顺序。

 

  运行如下:

  

if __name__ == "__main__":

从上面的结果 (<class 'main.FatBoss'>, <class 'main.FatFather'>, <class 'object'>) 可以看出,super() 方法在 FatBoss 会直接调用父类是 FatFather ,所以单继承是没问题的。

 

  那么如果多继承的话,会有什么问题呢?

  2.4 多继承使用super()

  假设再写一个胖子老板的女儿类,和 胖子老板的老婆类,此时女儿需要同时继承 两个类(胖子老板类,胖子老板老婆类)。

  因为胖子老板有一个爱好,胖子老板的老婆需要干活干家务,那么女儿需要帮忙同时兼顾。

  此时女儿就是需要继承使用这两个父类的方法了,那么该如何去写呢?

  下面来看看实现代码:

  

# 胖子老板的父类

运行结果如下:

 

  

if __name__ == "__main__":

从上面的运行结果来看,我特意给每个类的调用开始以及结束都进行打印标识,可以看到。

 

  每个类开始调用是根据MRO顺序进行开始,然后逐个进行结束的。

  还有就是由于因为需要继承不同的父类,参数不一定。

  所以,所有的父类都应该加上不定参数*args , **kwargs ,不然参数不对应是会报错的。

  三、注意事项

  ·super().init相对于类名.init,在单继承上用法基本无差。

  ·但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次,可以尝试写个代码 来看输出结果。

  ·多继承时,使用super方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错。

  ·单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错。

  ·多继承时,相对于使用类名.init方法,要把每个父类全部写一遍, 而使用super方法,只需写一句话便执行了全部父类的方法,这也是为 何多继承需要全部传参的一个原因。

  四、练习

  以下的代码的输出将是什么? 说出你的答案并解释。

  

class Parent(object):

注意:Child1已经拥有了属于自己的x

 

  

Parent.x = 3

以上就是Python中的super()方法详解的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

 

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

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