鱼C论坛

 找回密码
 立即注册
查看: 1846|回复: 6

Python多重继承的二义性问题

[复制链接]
发表于 2018-5-11 15:40:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> class A:
        def test(self):
                print("aaaaa")
               
>>> class B:
        def test(self):

                print("bbbbb")
>>> class C(A,B):
        pass

>>> ccc=C()
>>> ccc.test()
aaaaa
=================
这里A类和B类都定义了test函数,C类同时继承A类和B类,当C类的实例对象调用test的时候,是调用哪个父类的test方法呢?
我试了下,如果A在B前,则调用A的;B在A前,则调用B的,那如果 class C(A,B)既A在B前的时候,我想调用B的test方法该怎么做
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-11 15:47:59 | 显示全部楼层
我想到的一个方法是B.test(ccc)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 16:12:22 | 显示全部楼层
指明想用哪个父类的方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 16:41:18 | 显示全部楼层
本帖最后由 ABC23 于 2018-5-11 16:43 编辑

哇,好高大上的名字。(Python多重继承的二义性问题!)

http://python.jobbole.com/85685/
看这篇文章,我觉得写的不错。

另外,既然知道这样会引起歧义那就应该尽量避免灾父类中使用同名方法。Java不支持多即成,人家不也好好的吗。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 17:01:11 | 显示全部楼层
MRO( Method resolution order),python2 和3是不同的。深度优先和广度优先的区别。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 21:16:25 | 显示全部楼层
恕我才疏学浅,应该是没有办法的,我们打印一下ccc的内部就可以看到,继承了一个test方法,但是再打印test方法(只打印test标签,不执行方法),就可以看到,明确写着是A.test, 说明在内部,就直接保存了父类A的方法,是没有办法调用到父类B的test方法的,鱼与熊掌不可兼得

如果说非要执行,上面的方法 B.test(ccc) 也是可以的,多态的应用吧 ,但是这样和 B.test(B) 有什么却别,何必再多创建一个c对象呢,纯属个人观点
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-5-11 21:20:00 | 显示全部楼层
DevenVan 发表于 2018-5-11 21:16
恕我才疏学浅,应该是没有办法的,我们打印一下ccc的内部就可以看到,继承了一个test方法,但是再打印test方法( ...

MRO算法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-30 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表