小编给大家分享一下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 nullPython中super () . __init__和Base.__init__的区别是什么