Python中super () . __init__和Base.__init__的区别是什么

  介绍

小编给大家分享一下Python中超级(). __init__和Base.__init__的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

我们在使用Python中的类继承时,子类继承父类后,在重载父类的方法后,在方法中如果要执行父类对应的方法,一般有两种方式:超级和基地(表示父类名)。

使用例子

先看下面一段代码:

#,- *安康;编码:,utf-8  - * -class 基础:   ,,,def  __init__(自我):   ,,,,,,,self.postion =, (0, 0),,,, def 移动(自我,,x,, y):   ,,,,,,,self.postion =, (self.postion [0], +, x,, self.postion [1], +, y) class 设备(基础):   ,,,def  __init__(自我):   ,,,,,,,超级(设备,,自我). __init__ ()   ,,,,,,,self.offset =,(0, 0),,,, #,记录本次位置偏移量   ,,,def 移动(自我,,x,, y):   ,,,,,,,self.offset =, (self.postion[0],安康,x,, self.postion[1],安康;y)   ,,,,,,,超级(设备,,自我).move (x, y),,,,,,,,   ,,,def  get_offset(自我):   ,,,,,,,return 自我。抵消

在基类中,有一个移动方法用来移动位置,在子类中我们想要增加一个记录,记住每次移动的偏移量,那么我们就在子类中重载移动函数,执行我们自定义的操作(记录偏移量),然后继续执行父类的移动动作,直接调用父类移动函数就可以避免我们重新实现移动位置的动作。

在上面的例子中,我们使用了超级来调用父类方法,那么能不能使用基地来调用呢?

....   Base.__init__(自我)   ……   Base.move(自我,,x,, y)   …

可以看调到基地用父类函数时,必须在函数中传递自我参数。之前的文章中我们了解到类的普通函数调用需要使用类对象调用,而类的普通函数第一个参数默认是自我,调用时不需要传递此参数,因为通过对象调用会自动传递。但是直接使用基类名调用时,方法内部需要知道的自我是谁。那么两种方式都可以,他们有区别吗?当然是有的

首先看一下超级的定义

class 超级(对象):   ,,,,,,   ,,,超级(),→,same  as 超级(__class__进行,& lt; first  argument>)   ,,,超级(类型),→unbound  super 对象   ,,,超级(类型、,obj),→, bound  super 对象;,requires  isinstance (obj,类型)   ,,,超级(类型,类型2),→,bound  super 对象;,requires  issubclass(类型2,,类型)   ,,,Typical  use 用call  a  cooperative  superclass 方法:   ,,,class  C (B):   ,,,,,,,def 冰毒(自我,,参数):   ,,,,,,,,,,,超级().meth (arg)   ,,,却;能够情况,for  class  methods :   ,,,class  C (B):   ,,,,,,@classmethod   ,,,,,,,def  cmeth (cls,参数):   ,,,,,,,,,,,超级().cmeth (arg)   ,,,“““

可以看的到,超级有四种调用方式

超级():相当于超级(当前类名,第一个参数),,,python3中新增的方式

超级(类型):没有绑定对象

超级(类型、obj):绑定对象,要求obj的类型是类型或者其子类

超级(类型,类型2):绑定对象,要求type2是类型的子类

这里我们就先说一下超级()和超级(类型、obj),这是我们常用的方式

在上面的例子中我们看到超级和基地的方式一样,接下来我们再看一个例子

#,- *安康;编码:,utf-8  - * -class 基础:   ,,,def  __init__(自我):   ,,,,,,,印刷(“Base")   ,,,,,,,self.name =,“Base" class  Device1(基础):   ,,,def  __init__(自我):   ,,,,,,,Base.__init__(自我)   ,,,,,,,印刷(“Device1")   ,,,,,,,self.name1 =,“Device1" class  Device2(基础):   ,,,def  __init__(自我):   ,,,,,,,Base.__init__(自我)   ,,,,,,,印刷(“Device2")   ,,,,,,,self.name2 =,“Device2" class 子(Device1, Device2):   ,,,def  __init__(自我):   ,,,,,,,Device1.__init__(自我)   ,,,,,,,Device2.__init__(自我)   ,,,,,,,印刷(“Sub")   ,,,,,,,self.name3 =,“Sub"      ,,,def 测试(自我):   ,,,,,,,印刷(“测试:,,,,self.name2)      时间=s 子()   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Python中super () . __init__和Base.__init__的区别是什么