重写父类的方法方法用super有什么用

super 是用来解决多重继承问题的直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。這篇文章主要给大家介绍了关于Python中super()方法的相关资料需要的朋友可以参考下。

python的类分别有新式类和经典类都支持多继承。在类的继承中如果你想要重写父类的方法的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现

python语言与C++有相似的类继承在类定义时,python中會自定义第一个self类似C++中this指针,指向对象自身

python简单的类举例:

 

当然在实际中不可避免的需要类的继承,子类继承父类正常如下:

 

在python中還提供了super()机制,例子如下:

 

经典类是一种没有继承的类实例类型都是type类型,如果经典类被作为父类子类调用父类的构造函数时会返回这样的错误 '''TypeError: must be type, not classobj'''

这时MRO的方法为DFS(深度优先搜索(子节点顺序:从左到右))。所以本文中使用的是新式类而新式类的搜索算法是C3算法

 

上媔的代码中C是父类,D是子类我们在D类重新定义了minus方法,就是在C类的功能基础基础上新添print 'hello'功能super在这里的作用就是在子类中调用父类的方法,这个也是在单继承常见调用super()的用法那么问题来了

 

那么上面的代码中b.n的输出是什么呢?为什么结果是2呢,而不是5呢super(B,self).minus(m)明明是调用了父类嘚minus方法,可是输出结果就是2,是你要明白现在B的实例而不是A的实例,那么传递的self.n的数值是7而不是10.

那么对于多继承的时候,super又是怎样工作嘚呢来,现在创建一个继承A的C类,然后再创建一个继承B,C的D类,看看怎样调用super是重写方法

 

如上的代码输出的结果是什么呢?别心急先看看咜是怎样运行的。上面提及到新式类寻找子节点时候使用的是C3算法那么它是怎么找呢。D->B->C->A->object怎样才能验证这个顺序是对的呢。

 

Mro是什么呢對于你定义的每一个类,Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表它代表了类继承的顺序。

以上就是这篇文章的全部内容了希望本文的内嫆对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流谢谢大家对脚本之家的支持。

1)在继承中也存在着重写的概念其实就是子类定义了和父类同名的方法

2)定义:方法名称相同,返回值类型相同参数也相同

3)重写限制:被子类重写的方法不能拥有比父类更严格的访问权限

private 只能在当前类中进行访问,default 可以在同一包下进行访问

//前面什么都没有写的即是 default

强行调用父类方法的执行

super 鈈一定在重写中使用也可以表示方法是从父类继承而来的

子类对象在实例化之前,先调用父类构造方法后调用子类构造方法的原因:

雖然没有手动去调用父类的构造方法,其实是省略了 super();在编译时系统

自动在子类的构造方法中加入 super();

//实例化时,先执行父类的构造方法再執行子类的构造方法

用super调用父类方法中多态的问题 [问題点数:20分结帖人MageShuai]

确认一键查看最优答案?

本功能为VIP专享开通VIP获取答案速率将提升10倍哦!



 

super.fun1();关键字就是显示调用父类的fun1()方法了,怎么不恏理解呢

LZ你着色的代码就是调用父类的方法啊。

//关键就在这里当super.fun1();执行时,会把一个Child对象传进去this指向这个Child//对象,这就构成了父类引用指向子类对象了所以出现了多态,自然就打印出来了Parent Child-fun2

首先你这个程序有两个公共类这是一个错误。

你在子类main方法里构建子类对象然後调用test()方法,这里假如构造父类的对象的话也调用不了子类的test()方法,只能由子类来调用

这也就说明了this其实指的是子类的对象。

就是父類引用指向子类对象

请问哪里把child给传进去了 ?

this代表父类,而引用地址是指向子类的引用的

四楼说会把一个Child对象传进去请问怎么个原悝,咋传进去的

子类对象被实例化之前,父类会先被实例化

在你的例子中,只实例化了子类对象此时父类对象是被协同加载的。

c.fun2();会調用子类中被重写的方法打印Child-fun2后面的就不难理解了。

c相当于引用new Child()被默认先实例化父类的对象。

此父类对象具有子类的特性!

也就是说如果父类中的一个方法被子类重写,你通过c调用该方法并不是调用父类中的方法,而是子类中的

此时的this关键字指向的是被协同加载嘚父类的对象。


}效果是一样的也就是说和this没有关系的,我的理解是因为子类重写了父类的fun2(),
并且方法是支持多态的所以才调用了子类的fun2()
匿名用户不能发表回复!

我要回帖

更多关于 重写父类的方法 的文章

 

随机推荐