鱼C论坛

 找回密码
 立即注册
查看: 35|回复: 1

关于类和对象MRO继承顺序出错的困惑

[复制链接]
发表于 昨天 23:16 | 显示全部楼层 |阅读模式

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

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

x
我写了以下代码:

>>> class A:
...     def ping(self):
...         print("A ping~")
        def pong(self):
            print("A pong")
...
>>> class B(A):
...     def ping(self):
...         print("B ping~")
        def pong(self):
            print("B pong")
...
>>> class C(A):
...     def ping(self):
...         print("C ping~")

...
>>> class D(B, C):
...     def pingpong(self):
...         self.ping()
...         self.pong()         
...
>>> d = D()
>>> d.pingpong()

但在执行时报错,提示AttributeError: 'D' object has no attribute 'pong'

我的困惑是实例化对象d所属的类D里面有pong()函数啊,而且D类的父类里面也有pong()函数且项下也有执行语句(打印 B pong),那为何会报错?麻烦大神帮忙指点一下,谢谢!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 昨天 23:16 | 显示全部楼层
你遇到的问题是由于方法解析顺序 (MRO, Method Resolution Order) 导致的。在多重继承的情况下,Python 会根据 C3 线性化算法来决定方法的解析顺序。

这里是你代码的一个简化和可能的修复:
>>> class A:
...     def ping(self):
...         print("A ping~")
...     def pong(self):
...         print("A pong")
...
>>> class B(A):
...     def ping(self):
...         print("B ping~")
...     def pong(self):
...         print("B pong")
...
>>> class C(A):
...     def ping(self):
...         print("C ping~")
...
>>> class D(B, C):
...     def pingpong(self):
...         self.ping()
...         self.pong()         
...
>>> d = D()
>>> d.pingpong()

你可能会得到以下输出:
B ping~
A pong

这说明 MRO 的顺序依次为 D -> B -> C -> A。当调用 self.ping() 时,它会先在类 D 中寻找,然后是 B,找到 ping 方法并执行。同样地,调用 self.pong() 时,也会按照同样的顺序寻找,但由于类 B 中有 pong 方法,它调用了 A 类的 pong 方法,这就是为什么输出是 "A pong"。

如果你想要了解详细的 MRO,可以使用:
>>> print(D.__mro__)

它会打印出类 D 的 MRO 顺序,帮助你理解方法解析的过程。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-24 08:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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